Page 1 sur 2

Upload d'imageS et inser dans la BDD

Posté : 06 mars 2006, 23:11
par mily
Bonjour,

J'ai parcouru le forum de long en large et je n'ai pas trouvé exactement ce que je cherche... :?

Je m'explique. J'ai une page qui permet de créer des fiches descriptives pour des produits. Prix, villes, descriptions, etc... et une image. Cette image est uploadée sur le serveur et son nom est inséré dans la base, liée à l'ID du produit.
Cette fiche fonctionne parfaitement.

Sauf que j'aimerai insérer 3 images au lieu d'une seule. Et là... Je cale. J'ai essayé de me débrouiller de manière simple (trop simple sans doute) et ça ne fonctionne pas.

Voici mon code :
<?php
if ($ajoutArticle=="ok")
{
$MAX_FILE_SIZE = 200000;

    //fixe le type d extension de fichier
    $allowed_types = array("image/gif", "image/pjpeg", "image/jpeg", "image/jpg");
                        
    //stockage des proprietes ds des variables
    $fname = $HTTP_POST_FILES['photo']['name'];
    $ftype = $HTTP_POST_FILES['photo']['type'];
    $fsize = $HTTP_POST_FILES['photo']['size'];
    $ftmp  = $HTTP_POST_FILES['photo']['tmp_name'];

    //verifie si le type de fichier est bien autorise
     if(!in_array($ftype, $allowed_types))
    {
    //message si n\'est pas correct
    die("<br><center><b>Le format de votre photo n est pas correct.</b>
<br>Seuls sont acceptes =>.bmp, .gif, .jpg, .jpeg<br><a href = 'BienAjout.php'><b>R&eacute;essayer</b></a></center>");
    }
   //verifie taile
    if($fize > $MAX_FILE_SIZE)
    {
    //si superieur on affiche un message
    die("<center>Votre fichier est trop gros!!!<br><a href ='BienAjout.php'><b>R&eacute;essayer</b></a></center><br>");
    }
    
    //si tout est ok, on copie le fichier ds le repertoire fixe et affiche un message si tout est ok
    if(copy($ftmp,"../image/".$fname))
    {
    echo"<br><center><h3>Annonce correctement enregistr&eacute;e</h3></center>";
    }   
                                   
    //requete pour inserer les nouvelles données dans la base
    $requete="INSERT INTO datahouse    (idmoyen, idbien, idvilles, prix, idpieces, reference, surface, description, date, chambres, annee, terrain, sejour, contact, idchauffage, cave, garage, photo)
VALUES('".$_POST['idmoyen']."', '".$_POST['idbien']."', '".$_POST['idvilles']."', '".$_POST['prix']."', '".$_POST['idpieces']."', '".$_POST['reference']."', '".$_POST['surface']."', '".$_POST['description']."', '".$_POST['date']."', '". $_POST['chambres']."', '". $_POST['annee']."', '". $_POST['terrain']."', '". $_POST['sejour']."', '". $_POST['contact']."', '". $_POST['idchauffage']."', '". $_POST['cave']."', '". $_POST['garage']."', '$fname')";
    $verif = mysql_query($requete);
    
    }
    ?>
et pour mon fichier à uploader, c'est juste un : <input name="photo" type="file">

Pour uploader 3 photos au lieu d'une seule, j'ai essayé tout bêtement avec un
$fname = $_FILES['photo']['name'];
	$ftype = $_FILES['photo']['type'];
	$fsize = $_FILES['photo']['size'];
	$ftmp  = $_FILES['photo']['tmp_name'];
	
	$fname2 = $_FILES['photo2']['name2'];
	$ftype = $_FILES['photo2']['type'];
	$fsize = $_FILES['photo2']['size'];
	$ftmp2 = $_FILES['photo2']['tmp_name'];

etc...
et un
if((copy($ftmp,"../image/".$fname))&&(copy($ftmp2,"../image/".$fname2))&&(copy($ftmp3,"../image/".$fname3)))
et, évidemment "INSERT INTO ... bla bla... photo, photo2, photo3".

mais ça ne marche pas... :sad:

J'ai bien entendu parler du FOREACH mais... si j'arrive à peu près à m'en servir pour uploader 3 images dans un dossier, je n'arrive pas à m'en servir pour entrer précisement photo, photo2 et photo3 dans ma base.

Quelqu'un aurait-il une idée ? Une orientation à m'offrir ?

Un grand merci par avance et désolée pour la longueur du message !!!

mily

Posté : 06 mars 2006, 23:17
par Cyrano
Primo, la formulation $HTTP_POST_FILES est obsolète, remplace par $_FILES.

Ensuite, quelles sont les valeurs des attributs name de tes champs "file" du formulaire : ce sont ces noms que tu vas retrouver en premier index de $_FILES : donc logiquement si tes champs se nomment photo1, photo2 et photo3, tu dois récupérer les fichiers et les infos qui vont avec dans $_FILES['photo1'], $_FILES['photo2'] et $_FILES['photo3']

Posté : 06 mars 2006, 23:43
par Invité
Oups !
Désolée pour les HTTP_POST_FILES. D'ailleurs, dans mes essais, je les ai remplacé par des _FILES, oui.

Merci de ton aide, Cyrano !!!

Pour les noms de mes trois champs files dans le formulaire, j'ai mis "photo", "photo2" et "photo3", effectivement.

Et pour ce qui est de $_FILES['photo1'], $_FILES['photo2'] et $_FILES['photo3'], je crois que c'est ce que j'ai essayé. Enfin, à force, je ne suis plus très sûre... :-/

J'ai fait :
$fname = $_FILES['photo']['name'];
    $ftype = $_FILES['photo']['type'];
    $fsize = $_FILES['photo']['size'];
    $ftmp  = $_FILES['photo']['tmp_name'];
    
    $fname2 = $_FILES['photo2']['name2'];
    $ftype = $_FILES['photo2']['type'];
    $fsize = $_FILES['photo2']['size'];
    $ftmp2 = $_FILES['photo2']['tmp_name']; 

... etc ...
C'est ça ?

J'ai aussi essayé
$fname = $_FILES['photo2']['name2'];
........ etc........
$fname = $_FILES['photo3']['name3'];
....... etc.........
Le problème, c'est que ça fonctionne pour la première photo (l'upload et l'insère dans la BDD) mais pas pour les deux autres !
Et ça ne me mets pas d'erreur... :?

Argh !!! Je tourne en rond !!!

Mily

Posté : 06 mars 2006, 23:47
par Cyrano
Non, attention, le second index de $_FILES est fixé par défaut, tu ne dois donc rien modifier: pour vérifier ce que tu reçois, en début de page de traitement, ajoute ceci:
<pre>
<?php
var_dump($_FILES);
?>
</pre>
Vois ce que ça t'affiche et reviens avec ça.

Posté : 07 mars 2006, 00:02
par Invité
Ouille !!!
Effectivement, y'a des erreurs. C'est magique... :?

Sur la page où j'ai mis
$fname = $_FILES['photo']['name'];
$fname2 = $_FILES['photo2']['name2'];
$fname3 = $_FILES['photo3']['name3'];


Ca donne :
array(3) { ["photo"]=>  array(5) { ["name"]=>  string(8) "001a.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpbGxBsI" ["error"]=>  int(0) ["size"]=>  int(35374) } ["photo2"]=>  array(5) { ["name"]=>  string(8) "001b.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpUw6o5S" ["error"]=>  int(0) ["size"]=>  int(36644) } ["photo3"]=>  array(5) { ["name"]=>  string(8) "001c.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpaI61hy" ["error"]=>  int(0) ["size"]=>  int(15442) } }

Warning: copy(../image/): failed to open stream: Is a directory in /XXX/XXX/www/admin/BienAjout.php on line 216
Et en faisant :
$fname = $_FILES['photo']['name'];
........ etc........
$fname = $_FILES['photo2']['name'];
........ etc........
$fname = $_FILES['photo3']['name'];
....... etc.........


Ca donne la même chose sauf le Warning :
array(3) { ["photo"]=>  array(5) { ["name"]=>  string(8) "001a.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpE3qNWd" ["error"]=>  int(0) ["size"]=>  int(35374) } ["photo2"]=>  array(5) { ["name"]=>  string(8) "001b.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpW6Jr1R" ["error"]=>  int(0) ["size"]=>  int(36644) } ["photo3"]=>  array(5) { ["name"]=>  string(8) "001c.jpg" ["type"]=>  string(10) "image/jpeg" ["tmp_name"]=>  string(14) "/tmp/phpfQAAu2" ["error"]=>  int(0) ["size"]=>  int(15442) } } 
Mais... heu... pour moi c'est du Chinois :(

En tout cas, merci d'essayer de m'aider (surtout à cette heure là !)

Mily

Posté : 07 mars 2006, 00:06
par Cyrano
C'est pour ça que j'indiquais des balises <pre> avant et après, l'affichage est nettement plus lisible... :-k

Posté : 07 mars 2006, 00:11
par Invité
RE-désolée !!! (il est un peu tard...)

Voici donc :

Code : Tout sélectionner

array(3) { ["photo"]=> array(5) { ["name"]=> string(8) "001a.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phptPqM03" ["error"]=> int(0) ["size"]=> int(35374) } ["photo2"]=> array(5) { ["name"]=> string(8) "001b.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phppr1WEo" ["error"]=> int(0) ["size"]=> int(36644) } ["photo3"]=> array(5) { ["name"]=> string(8) "001c.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpfEGxYl" ["error"]=> int(0) ["size"]=> int(15442) } }

Posté : 07 mars 2006, 00:18
par Cyrano
avec des balises [code], c'est encore plus facile, tu ne trouves pas ? Bon, nous avons donc les informations clairement affichées : tu as les index corespondant aux noms des champs du formulaire et les index des informations. Donc maintenant, il faut aller plus loin et voir pourquoi ça ne fonctionne pas au niveau de l'upload. On sait que les informations arrivent, il reste à les exploiter.

Tu as évoqué une boucle foreach() pour effectuer la manoeuvre, on peut voir ça ?

Posté : 07 mars 2006, 00:34
par Invité
Bah... Le problème, c'est que le ForEach, je l'avais fait autrement :? Oui, je sais, je suis pas emm... et je devrais creuser un peu avant de passer à autre chose... :oops:

J'avais fait un :
if ($ajoutArticle=="ok")
{
foreach ($_FILES["photo"]["error"] as $key => $error) {
   if ($error == UPLOAD_ERR_OK) {
       $tmp_name = $_FILES["photo"]["tmp_name"][$key];
       $name = $_FILES["photo"]["name"][$key];
       copy($tmp_name, "../image/".$name);
   }
	echo"<br><center><h3>Annonce correctement enregistr&eacute;e</h3></center>";
	}
   								
	//requete insert
$requete="INSERT INTO datahouse	(idmoyen, idbien, idvilles, prix, idpieces, reference, surface, description, date, chambres, annee, terrain, sejour, contact, idchauffage, cave, garage, photo, photo2, photo3) VALUES('".$_POST['idmoyen']."', '".$_POST['idbien']."', '".$_POST['idvilles']."', '".$_POST['prix']."', '".$_POST['idpieces']."', '".$_POST['reference']."', '".$_POST['surface']."', '".$_POST['description']."', '".$_POST['date']."', '". $_POST['chambres']."', '". $_POST['annee']."', '". $_POST['terrain']."', '". $_POST['sejour']."', '". $_POST['contact']."', '". $_POST['idchauffage']."', '". $_POST['cave']."', '". $_POST['garage']."', '$name')";
	
	$verif = mysql_query($requete);
	
	}
	?>
et dans le formulaire, c'était devenu :
<input type="file" name="photo[]" /><br />
<input type="file" name="photo[]" /><br />
<input type="file" name="photo[]" />

Qui ne fonctionnait pas non plus, bien sûr...

Posté : 07 mars 2006, 00:47
par Cyrano
On va faire une petite modification :
<?php
if ($ajoutArticle=="ok")
{
    foreach ($_FILES as $photo)
    {
        if (!empty($_FILES[$photo]['name']))
        {
            $tmp_name = $_FILES[$photo]["tmp_name"];
            $name = $_FILES[$photo]["name"];
            copy($tmp_name, "../image/".$name);
        }
        echo"<br><center><h3>Annonce correctement enregistr&eacute;e</h3></center>";
    }

    //requete insert
    $requete="INSERT INTO datahouse (idmoyen, idbien, idvilles, prix, idpieces, reference, surface, description, date, chambres, annee, terrain, sejour, contact, idchauffage, cave, garage, photo, photo2, photo3) ".
             "VALUES('".$_POST['idmoyen']."', '".$_POST['idbien']."', '".$_POST['idvilles']."', '".$_POST['prix']."', '".$_POST['idpieces']."', '".$_POST['reference']."', '".$_POST['surface']."', '".$_POST['description']."', '".$_POST['date']."', '". $_POST['chambres']."', '". $_POST['annee']."', '". $_POST['terrain']."', '". $_POST['sejour']."', '". $_POST['contact']."', '". $_POST['idchauffage']."', '". $_POST['cave']."', '". $_POST['garage']."', '$name')";

    $verif = mysql_query($requete);
}
?>

Posté : 07 mars 2006, 01:03
par Invité
Merci de ton aide !

Je me retrouve avec un : Warning: Illegal offset type in /XXX/XXX/www/admin/BienAjout.php on line 179

Et la ligne 179, c'est if (!empty($_FILES[$photo]['name']))

Au fait, les input type du formulaire, je les laisse bien en
<input type="file" name="photo[]" /><br />
<input type="file" name="photo[]" /><br />
???
Je finis par me mélanger les pinceaux...

Posté : 07 mars 2006, 01:26
par Invité
Mmmhhh... Si j'ai bien compris le Manuel PHP, "Illegal offset type" signifie qu'on a le droit de mettre :
$tmp_name = $_FILES["photo"]["tmp_name"];
mais pas
$tmp_name = $_FILES[$photo]["tmp_name"];

:?: :? :-k

Mais si je fais ça (remplacer le $photo par "photo", là, j'ai un
Warning: copy(Array): failed to open stream: No such file or directory in /XXX/XXX/www/admin/BienAjout.php on line 183

ligne 183 : copy($tmp_name,"../image/".$name);



](*,)

Posté : 07 mars 2006, 01:36
par Cyrano
Attention, laisse des noms de champ de formulaire sans crochets : si tu fais ça, ça crée un tableau : or $_FILES est déjà un tableau : avec les crochets, si tu refais l'expérience du var_dump, tu vas voir une modification dans l'affichage.

Posté : 07 mars 2006, 14:09
par Invité
Effectivement... :-k

Aussi bien avec
$tmp_name = $_FILES[photo]['tmp_name'];
que
$tmp_name = $_FILES['photo']['tmp_name'];
ou
$tmp_name = $_FILES['photo'][tmp_name];
ou même
$tmp_name = $_FILES[photo][tmp_name];
J'ai toujours la même erreur :
Warning: copy(Array): failed to open stream: No such file or directory in /XXX/XXX/www/admin/BienAjout.php on line 183

Et en remplaçant $photo par "$photo", il n'y a plus aucune erreur, mais aucun enregistrement ne se fait.

Un doute m'étreind... Est-ce juste un problème de syntaxe ? 8-[

Posté : 07 mars 2006, 14:16
par Cyrano
Je me demande si tu as bien saisi le principe de fonctionnement de la boucle foreach que je t'ai suggéré :-k Si tu as bien viré les crochets dans les noms des champs du formulaire, ça devrait fonctionner normalement...