Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 18h14   #1
Invité de passage
 
Homme
Webdesigner
Inscription : février 2008
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Webdesigner

Informations forums :
Inscription : février 2008
Messages : 4
Points : 2
Points : 2
Par défaut upload images aux résultats aléatoires

Bonjour
J'ai un formulaire de création d'article avec possibilité de télécharger 3 photos, dans un nouveau dossier créé pour l'occasion. Or, lorsque l'on demande d'uploader 2 ou 3 photos, le résultat est aléatoire. Pour 2 images, je n'en ai qu'une de téléchargée, pour 3, c'est variable: des fois 1, des fois 2....
Si vous avez une idée, là, je sèche...
Merci d'avance pour vos avis et conseils.
Voici le code en question:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
$nom_dossier= $nouvel_id."-".date('d-m-y')."-".time();
$extension = array('jpg', 'JPG', 'JPEG', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$path = "../boutik/imag-art/".$nom_dossier."/";
// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['Enregistrer'])) {
    // on se connecte  notre base
    include ('includes/connect.inc.php');
    //déclaration chargement photo
    if(isset($_FILES['fichier']))
    {
        //$_FILES existe
 
        $compteur=0;
set_time_limit(300);//modification de la limitation de temps d'exécution du script en seconde
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier
 
        foreach ($_FILES['fichier']['name'] as $key => $value) 
        {
            $fichier=$value;//nom reel de l'image
            $size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets
            $tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)
            $type=$_FILES['fichier']['type'][$key];//type de l'image
 
 
                //vérification du type de l'image et son poids
                if ( in_array(substr($fichier, -3), $extension) && $size<=20000000  )
                { 
 
                    // type mime jpeg, jpg, gif ou png poids < à 4194304 octets soit 4Mo
                    //le nouveau nom de l'image est composé du nouvel id, de -, de la date format unix, d'un point et de l'extension.
                    $nom_final= $nouvel_id."-".date('d-m-y')."-".time().".".substr($fichier, -3);
                  //on déplace l'image dans le répertoire final
                    if (move_uploaded_file($tmp, $path.$nom_final)) 
                    {
                        //Message indiquant que tout s'est bien passé
 
                        $bravo = '<p>Votre référence a bien été prise en compte</p>';
                    }
 
              }
 
            $tab_final[$compteur] = $nom_final;
            $compteur++;
        }
    }//fin de l'instruction if  isset($_FILES['fichier'])
 
    // on teste la déclaration des variables
    if (!isset($_POST['descriptif']) && ($_POST['titre']) && ($_POST['prix'])) 
    {
        $erreur = 'Les variables nécessaires au script ne sont pas définies.';
    }
    else {
          if (empty($_POST['descriptif']) || empty($_POST['titre']) || empty($_POST['prix'])) 
          {
            $erreur = '<p>Le champ description, titre ou prix est vide.</p>';
          }
 
        // si tout est bon, on peut commencer l'insertion dans la base
        else {
            // lancement de la requête d'insertion
            //définition des variables
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
$type = $_POST['type'];
$cc = $_POST['cc'];
$genre = $_POST['genre'];
$titre = $_POST['titre'];
$descrip = $_POST['descriptif'];
$devis = $_POST['devis'];
$port = $_POST['port'];
$prix = $_POST['prix'];
$photo = $_FILES['fichier'];
$famille = $_POST['nomfamille'];
$nam_photo = $nom_final;
 
            $sql = "INSERT INTO stock 
			(id_article, famille, marque, modele, annee, type, cc, prix, devis, titre, descriptif, port, date_insert, nom_dossier, nam_photo) 
			VALUES
			('', '".$famille."', '".$marque."', '".$modele."', '".$annee."', '".$type."', '".$cc."', '".$prix."', '".$devis."', '".$titre."' ,'".$descriptif."', '".$port."', NOW(), '".$nom_dossier."', '".$nam_photo."')";
            // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
            mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
 
 
 
        }
 
 
      }
    }
et la partie html du form:
Code :
1
2
3
4
5
<input type="hidden" name="MAX_FILE_SIZE" VALUE="20000000" />
<legend>Upload des photos:</legend><br />
<label for="photo">Photo 1:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 2:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 3:</label><input type="file" name="fichier[]" /><br />
Boro64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h34   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Commence par controler ce que contient $_FILES dans les cas ou ca ne fonctionne pas.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h46   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Mmmh ça ressemble à un problème du même genre que j'ai eu...

Fais un var_dump sur $_FILES ça sort quoi ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h48   #4
Invité de passage
 
Homme
Webdesigner
Inscription : février 2008
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Webdesigner

Informations forums :
Inscription : février 2008
Messages : 4
Points : 2
Points : 2
je viens de faire
Code :
1
2
3
4
5
6
7
8
if($_SERVER['REQUEST_METHOD']=='POST') { 
    echo '<pre>'; 
    print_r($_POST); 
    echo '</pre>'; 
    echo '<pre>'; 
    print_r($_FILES); 
    echo '</pre>'; 
}
et cela donne:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
Array
(
    [nomfamille] => 
    [marque] => 
    [modele] => 
    [annee] => 
    [type] => 
    [cc] => 
    [prix] => 1
    [port] => -----
    [titre] => eqzgtergterg
    [descriptif] => sqdfvfdgrsdgerg
    [MAX_FILE_SIZE] => 20000000
    [Enregistrer] => Enregistrer
)
 
Array
(
    [fichier] => Array
        (
            [name] => Array
                (
                    [0] => P1010001.JPG
                    [1] => P1010002.JPG
                    [2] => P1010003.JPG
                )
 
            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                )
 
            [tmp_name] => Array
                (
                    [0] => /tmp/phpRmlYpe
                    [1] => /tmp/phpF7S4Up
                    [2] => /tmp/phpxsWj1X
                )
 
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )
 
            [size] => Array
                (
                    [0] => 669727
                    [1] => 705948
                    [2] => 616808
                )
 
        )
 
)
 
Array
(
    [nomfamille] => 
    [marque] => 
    [modele] => 
    [annee] => 
    [type] => 
    [cc] => 
    [prix] => 1
    [port] => -----
    [titre] => eqzgtergterg
    [descriptif] => sqdfvfdgrsdgerg
    [MAX_FILE_SIZE] => 20000000
    [Enregistrer] => Enregistrer
)
 
Array
(
    [fichier] => Array
        (
            [name] => Array
                (
                    [0] => P1010001.JPG
                    [1] => P1010002.JPG
                    [2] => P1010003.JPG
                )
 
            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                )
 
            [tmp_name] => Array
                (
                    [0] => /tmp/phpRmlYpe
                    [1] => /tmp/phpF7S4Up
                    [2] => /tmp/phpxsWj1X
                )
 
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )
 
            [size] => Array
                (
                    [0] => 669727
                    [1] => 705948
                    [2] => 616808
                )
 
        )
 
)
 
Array
(
    [nomfamille] => 
    [marque] => 
    [modele] => 
    [annee] => 
    [type] => 
    [cc] => 
    [prix] => 1
    [port] => -----
    [titre] => eqzgtergterg
    [descriptif] => sqdfvfdgrsdgerg
    [MAX_FILE_SIZE] => 20000000
    [Enregistrer] => Enregistrer
)
 
Array
(
    [fichier] => Array
        (
            [name] => Array
                (
                    [0] => P1010001.JPG
                    [1] => P1010002.JPG
                    [2] => P1010003.JPG
                )
 
            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => image/jpeg
                    [2] => image/jpeg
                )
 
            [tmp_name] => Array
                (
                    [0] => /tmp/phpRmlYpe
                    [1] => /tmp/phpF7S4Up
                    [2] => /tmp/phpxsWj1X
                )
 
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )
 
            [size] => Array
                (
                    [0] => 669727
                    [1] => 705948
                    [2] => 616808
                )
 
        )
 
)
Boro64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 18h51   #5
Invité de passage
 
Homme
Webdesigner
Inscription : février 2008
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Webdesigner

Informations forums :
Inscription : février 2008
Messages : 4
Points : 2
Points : 2
et var_dump me répond ça:
Code :
&#65279;array(1) { ["fichier"]=> array(5) { ["name"]=> array(3) { [0]=> string(12) "P1010001.JPG" [1]=> string(12) "P1010002.JPG" [2]=> string(12) "P1010003.JPG" } ["type"]=> array(3) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(10) "image/jpeg" } ["tmp_name"]=> array(3) { [0]=> string(14) "/tmp/phpQBiYIa" [1]=> string(14) "/tmp/phpjaKQrL" [2]=> string(14) "/tmp/php4DuKLI" } ["error"]=> array(3) { [0]=> int(0) [1]=> int(0) [2]=> int(0) } ["size"]=> array(3) { [0]=> int(669727) [1]=> int(705948) [2]=> int(616808) } } } array(1) { ["fichier"]=> array(5) { ["name"]=> array(3) { [0]=> string(12) "P1010001.JPG" [1]=> string(12) "P1010002.JPG" [2]=> string(12) "P1010003.JPG" } ["type"]=> array(3) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(10) "image/jpeg" } ["tmp_name"]=> array(3) { [0]=> string(14) "/tmp/phpQBiYIa" [1]=> string(14) "/tmp/phpjaKQrL" [2]=> string(14) "/tmp/php4DuKLI" } ["error"]=> array(3) { [0]=> int(0) [1]=> int(0) [2]=> int(0) } ["size"]=> array(3) { [0]=> int(669727) [1]=> int(705948) [2]=> int(616808) } } } array(1) { ["fichier"]=> array(5) { ["name"]=> array(3) { [0]=> string(12) "P1010001.JPG" [1]=> string(12) "P1010002.JPG" [2]=> string(12) "P1010003.JPG" } ["type"]=> array(3) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(10) "image/jpeg" } ["tmp_name"]=> array(3) { [0]=> string(14) "/tmp/phpQBiYIa" [1]=> string(14) "/tmp/phpjaKQrL" [2]=> string(14) "/tmp/php4DuKLI" } ["error"]=> array(3) { [0]=> int(0) [1]=> int(0) [2]=> int(0) } ["size"]=> array(3) { [0]=> int(669727) [1]=> int(705948) [2]=> int(616808) } } }
Boro64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 12h32   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Hello

Je lisait ton code au passage et déjà, évite cette forme:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
$type = $_POST['type'];
$cc = $_POST['cc'];
$genre = $_POST['genre'];
$titre = $_POST['titre'];
$descrip = $_POST['descriptif'];
$devis = $_POST['devis'];
$port = $_POST['port'];
$prix = $_POST['prix'];
$photo = $_FILES['fichier'];
$famille = $_POST['nomfamille'];
$nam_photo = $nom_final;
remplace par:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
// Tous les champs mandataire doivent être
// à null dans le tableau default
$input_defaults = array(
	'marque' => '',
	'modele' => '',
	'annee'  => '',
        'type'   => '',
        'cc'     => '',
	'genre' => '',
	'titre' => null, // mandatory
	'descriptif' => null, // mandatory
	'port' => '',
	'prix' => null, // mandatory
	'fichier' => '',
	'nomfamille' => '');
 
$inputs = array_merge($input_defaults, array_intersect_key($_REQUEST, $input_default));
if (in_array(null, $inputs, true))
    echo "Parameters " . implode(',', array_intersect($inputs, array(null))) . " are missing";
Met les valeurs par défaut de tes champs de formulaires dans le tableau $input_defaults et mets les champs mandataires à 'null' pour les identifier.
ça va sécuriser les retour de formulaire, et éviter les warning sur des champs de tableau innexistants que tu devais sûrement avoir avant.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 12h43   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Egalement, je te déconseille cette forme:
Code :
1
2
 
if ( in_array(substr($fichier, -3), $extension) && $size<=20000000  )
Je te recommande plutôt
Code :
1
2
3
 
$ext = array_pop(explode('.', $name));
if (in_array($ext, $extension) && $size <= 2147483648))
(on ne sait jamais, les extensions peuvent être de 2 ou 3 caractères)

Ensuite, tu n'as pas besoin de tout ça :
Code :
1
2
3
 
$tab_final[$compteur] = $nom_final;
$compteur++;
tu peux faire
Code :
1
2
3
4
5
6
7
8
9
 
$tab_final = array();
 
// ....
 
$tab_final[] = $nom_final;
 
// Pour connaitre le nombre d'éléments
count($tab_final);


Au delà de ces améliorations mineures, je ne vois pas de problème particulier dans ton code. D'après ce que tu nous a fourni comme trace, je ne vois pas comment ton problème à pu survenir.

j'en profite pour te rappeller au passage que isset et empty ont le même comportement vis-a-vis des variables non assignées: inutile de faire les deux vérifications, empty suffit.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2011, 13h55   #8
Invité de passage
 
Homme
Webdesigner
Inscription : février 2008
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Webdesigner

Informations forums :
Inscription : février 2008
Messages : 4
Points : 2
Points : 2
Bonjour
Et merci Benjamin; je vais améliorer tout ça grâce à tes remarques.
Mais.....J'ai réussi à solutionner mon problème d'upload.
Le défaut venait du nouveau nom attribué à l'image;
Bien qu'utilisant les fonctions date() et time(), les fichiers uploadés s'écrasaient car avaient le même nom...parfois.....
La solution fut d'utiliser la fonction uniqid....MAIS, attention: Avec php5, le paramètre "facultatif" more_entropy...ne l'est pas
Donc (valable surtout pour des uploads qui ne nécessitent pas forcément un identifiant de 23 caractères supplémentaires), l'appel se fait alors ainsi:
Si ça peut aider....
Boro64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h01.


 
 
 
 
Partenaires

Hébergement Web