Upload d'imageS et inser dans la BDD

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Upload d'imageS et inser dans la BDD

par Invité » 07 mars 2006, 20:18

Mais quelle quiche !
Je confonds "crochet" et "guillemet"... houlaaaa... Ca va plus, moi... :?

Bon... On recommence...

"laisse des noms de champ de formulaire sans crochets".
Donc, je remplace mes input type="file" name="photo[]" par input type="file" name="photo" ?
OK.

Mais j'ai toujours le même problème.
On a le droit de mettre :
$tmp_name = $_FILES["photo"]["tmp_name"];
mais pas
$tmp_name = $_FILES[$photo]["tmp_name"]; 
Et en mettant "photo" au lieu de $photo, ça ne fonctionne pas plus...

par Cyrano » 07 mars 2006, 14:16

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...

par Invité » 07 mars 2006, 14:09

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-[

par Cyrano » 07 mars 2006, 01:36

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.

par Invité » 07 mars 2006, 01:26

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);



](*,)

par Invité » 07 mars 2006, 01:03

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...

par Cyrano » 07 mars 2006, 00:47

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);
}
?>

par Invité » 07 mars 2006, 00:34

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...

par Cyrano » 07 mars 2006, 00:18

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 ?

par Invité » 07 mars 2006, 00:11

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) } }

par Cyrano » 07 mars 2006, 00:06

C'est pour ça que j'indiquais des balises <pre> avant et après, l'affichage est nettement plus lisible... :-k

par Invité » 07 mars 2006, 00:02

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

par Cyrano » 06 mars 2006, 23:47

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.

par Invité » 06 mars 2006, 23:43

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

par Cyrano » 06 mars 2006, 23:17

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']