Conseils Sessions - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Conseils Sessions

Par paintbox -  10 reponses -  Le 30/07/2010 -  Flux RSS - 

Bonjour a tous,

 

je suis toujours sur ma page fiche produits et j'aurais besoin de conseils .

 

J'ai une page modification de produits existants (càd que le produit a déjà été encodé dans la base de données et que l'on peut le mettre à jour si on le veut). Cette page contient des champs dont les valeurs sont préremplie par les données correspondantes dans la base de données. Chacun de ces champs peut être modifié par l'utilisateur.

 

S'affichent également sur cette page les images du produit  (au nombre de 5) qui sont également dans la bd. Pour chacune des images, j'ai la possibilité de les modifier. Pour cela, on clique sur un bouton "changer image" qui renvoie vers une autre page qui permet de sélectionner une nouvelle image. De cette page en cliquant sur un bouton "upload", on retourne sur le formulaire puis si on le désir on peut changer les images suivantes par la même technique.

J'ai choisi cette méthode pour que l'image changée puisse être prévisualisée.

 

Bref, les images sont ±  au milieu de mon formulaire et donc avant d'arriver aux champs images, l'utilisateur aura peut etre déjà changé certains champs texte. La solution à laquelle j'avais pensé, était d'utiliser les sessions (tout nouveau pour moi) afin de conserver les données déjà encodées. Mais là où je rencontre un problème, c'est que les données des champs sont lus depuis la base de données et sont donc mis dans des variables de session et que si on retourne sur le formulaire (après avoir uploadé une nouvelle image) il n'a pas conservé les modifications faites puisque dans la session sont enregistrées les données lues dans la base de données.

 

Je ne vois pas trop comment 1° lire les données de la bd et les stocker dans des variables de sessions ?

2° stocker les modifications dans ces mêmes variables de sessions? En gros, ne doivent être modifiées que les champs modifiés

 

 Vos conseils sont donc les bienvenu.

 

Réponses apportées à cette discussion

Par Cyrano -  Le 01/08/2010 - 

Salut Paintbox,

une idée comme ça : Crée une variable de session parallèle, par exemple $_SESSION['modifications'] dans laquelle tu pourrais conserver les saisies du formulaire à partir du formulaire d'upload. Ça veut dire plusieurs choses :

 

  1. Du dois accéder au formulaire d'upload à partir d'un bouton du formulaire de modification et non à partir d'un lien : ce bouton doit soumettre le formulaire non pas vers le traitement mais vers le formulaire d'upload d'image; au chargement de ce dernier, tu pourras alors récupérer toutes les données du formulaire de modif;
  2. Au chargement du formulaire de modification, teste l'existence de la variable de session  $_SESSION['modifications'] : si elle existe, utilise la pour pré-remplir le formulaire, sinon, utilise les données de la base.
  3. Lors de la validation du formulaire de modification, si les données sont bonnes et enregistrées, n'oublie pas de détruire la variable de session en question histoire de ne pas avoir de surprises en voulant modifier la fiche d'un autre article.

 

Autre option quoique peut-être moins évidente, upload avec AJAX, comme ça tu restes sur le formulaire de modification sans changer de page, simplement tu fais afficher un formulaire d'upload dans un DIV. Mais d'abord au niveau accessibilité, c'est moins heureux, ensuite si tu n'as pas un minimum de connaissances en JavaScript et AJAX, tu vas ramer peu pour réussir ça.

 

 
Par paintbox -  Le 01/08/2010 - 

Hello Cyrano,

merci pour tes suggestions. 

Effectivement ton idée de créer un $_SESSION['modifications'] est une excellente idée. Je vais tenter cette solution.

Je ne m'y connais pas en JavaScript ou Ajax même si il y a certainement moyen de trouver des solutions toutes faites sur le net.

J'essaie de mettre cela en place et je te tiens au courant.

Merci 

 

 
Par paintbox -  Le 06/08/2010 - 

Hello Cyrano,

 

me revoilà avec mon problème.

J'ai suivi tes conseils concernant l'utilisation d'une session (pour conserver les champs modifiés). Cela fonctionne correctement, mais j'ai quand même un problème car dans mon formulaire "modification", l'affichage des images se fait par consultation de la base de données. Elle ont chacune un numéro de "rang"  qui me permet simplement lorsque je les ai enregistré (au début) de leur attribuer un nom selon la nomenclature suivante (type_de_bien+numéro_de_rang).

 

Donc là ou je rencontrais un problème c'est que j'ai eu beau créer une variable de session nommée ('rang_image') lorsque j'essayais de modifier cette image, le numéro de rang était chaque fois le numéro maximum et non le numéro courant.

 

Bref… cela m'a permis de me familiariser avec les sessions, mais mon problème est toujours là. J'ai donc décidé de forcer l'upoad d'images avant de modifier la fiche produit.

 

J'ai donc fais des recherche sur le net et suis tombé sur un script en JavaScript qui permet d'ajouter autant de boutons 'ajouter une image' qu'on veut (on peut qd même limiter). Ceci m'arrange bien parce que je voulais justement donner cette possibilité à l'utilisateur.

 

J'ai pu intégrer cela à mon code php, mais là où je bloque à présent est que je n'arrive pas (ne connaissant pas JavaScript) à récupérer le nom du fichier uploadé pour pouvoir ensuite le renomer et  l'enregistrer dans ma base de données et lui donner également un numéro de "rang". Ma fonction "ajout_image" permet de vérifier si une image est uploadée, la vérifie et la sauve dans un répertoire.

 

Pour info, ma page permet d'abord de rechercher l'article, puis affiche l'article recherche. 

 

Je me tourne donc vers toi pour voir si tu sais m'aider à ce niveau. J'avais pensé utiliser un $_FILES['file']['name'] comme en PHP mais visiblement, ca ne marche pas.

 

J'ai également suivi tes conseils en tachant de mieux structurer mon code. J'espère que cela se remarque.

 

 Voilà d'avance merci pour ton aide.

 

Voici mon code :

 

[code]

 <script>

function create_champ(i) {

 

var i2 = i + 1;

 

document.getElementById('leschamps_'+i).innerHTML = '<span><input type="file" name="file_'+i+'"></span>';

 

document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<br /><span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un champs</a></span>' : '';

}

</script>

 

</head>

 

<body>

<?php

include('connex.inc.php');

$idcom=connex('new_immo', 'myparam');

 

//Fonctions

//--------

function vignettes($id_biens) // Consulte la BD et affiche des vignettes des images

{

//Requete : lit les images depuis la BD

$sql_images=mysql_query("SELECT images.chemin_image FROM images INNER JOIN biens ON images.id_biens=biens.id_biens WHERE images.id_biens='$id_biens'") or die(mysql_error());//Requete spéciale pour l'affichage des différentes images

$nbImages = mysql_num_rows($sql_images); //Calcul du nombre total d'images

$i=0; //Compteur

//Affichage des images trouvées

echo '<p>Nombre d\'images trouvées : '.$nbImages.'<p/>';

echo '<table>';

echo '<tr>';

while($donnees=mysql_fetch_array($sql_images))

{

$image =$donnees['chemin_image'];

$h_vign = "100"; 

        $taille = getimagesize($image); 

        $reduc  = floor(($h_vign*100)/($taille[1])); 

        $l_vign = floor(($taille[0]*$reduc)/100); 

         echo '<td>';

         $rang_image=$i;

echo '<img src="'.$image.'" width="'.$l_vign.'" height="'.$h_vign.'">';

echo '<br />';

echo '<FORM action="" method="POST">';

echo '<label>Rang : '.$i;

echo '<br /><input type="submit"  name="choix" value="supprimer" id="'.$i.'"/>';

echo '<p>Rang image = '.$rang_image.'</p>';

echo '</FORM>';

echo '<br />';

echo '</td>';

$i++; //Incrémentation du compteur

}

echo '</tr>';

    echo '</table>';

echo '<br />';

}

 

 

function ajout_image($bien)

{

echo '<p>Bien :'.$bien.'</p>';

$image_id =mysql_insert_id(); //Récupération de l'id du dernier enregistrement

$dossier =strtolower($_POST['bien']);//Récupération du type de bien pour nom de dossier

$dossier .=$image_id;//Ajout du numéro du dernier enregistrement

mkdir("../images/$dossier", 0700);//Création du dossier pour ce nouveau bien

$content_dir ='../images/'; //Dossier où sera copié le fichier

$content_dir .=$dossier;

if(isset($_POST['upload'])) //Test Si le formulaire à été soumis

{

for ($i=0; $i<count($_FILES['file']['name']); $i++)

{

$new_name =strtolower($_POST['bien']);//Récupération du type de bien pour nom de l'image

$new_name .=$image_id; //Retourne l'id du dernier enregistrement

$new_name .="-";

$name_file =$_FILES['file']['name'][$i];

if (preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file))//Vérification du nom de fichier

{

exit ("Nom de fichier non valide");

}

$tmp_file=$_FILES['file']['tmp_name'][$i];

if(!is_uploaded_file($tmp_file))

{

exit("Le fichier est introuvable");

}

//On verifie maintenant l extension de l'image

$type_file=$_FILES['file']['type'][$i];

if(!strstr($type_file, 'jpg')&& !strstr($type_file, 'jpeg')&& !strstr($type_file, 'bmp')&& !strstr($type_file,'gif'))

{

exit("Le fichier n'est pas une image");

}

//On copie le fichier dans le dossier de destination en lui donnant un nouveau nom (bien+N° enregistrement)

$name_file =$content_dir.$_FILES['file']['name'][$i];

$ext =strtolower(pathinfo($name_file, PATHINFO_EXTENSION));//Permet de récupérer l'extension du fichier

$chemin_image =$content_dir."/".$new_name.$i.".".$ext;

//On insère l'image principale dans la table images en indiquant le numéro de biens correspondant dans la BD ainsi que son ordre d'apparition

if($_FILES['file'])

{

$new_name.="$i";

mysql_query("INSERT INTO images VALUES ('','".$image_id."', '".$chemin_image."', '1','".$i."')")  or die(mysql_error());

echo '<p>Image enregistrée dans DB</p>';

}

if(!move_uploaded_file($tmp_file, $chemin_image))//Copie les fichiers dans le bon répertoire

{

exit ("Impossible de copier le fichier dans $content_dir");

}

echo "Le fichier a bien été uploadé<br />";

echo "Le chemin d'accès est : ".$chemin_image."<br />";

echo '<p>***************************************</p>';

}

}

}

?>

 

 

<?php

//-> Denut formulaire

echo '<FORM action="images.php" method="POST" name="rechercher">';

echo '<legend>Indiquez le numéro du bien que vous recherchez : 

   <input type="text" name="id_biens" size="15"></legend>';

echo '<input type="submit"  name="rechercher" value="Rechercher"/>';

echo '</FORM>';

//<- FIN de formulaire

 

 

//-> Affichage du tableau après demande de recherche

if(!empty($_POST['id_biens']))

{

$id_biens=$_POST['id_biens'];

echo '<p>Résultat de votre recherche sur le bien : '.$id_biens.'</p>';

//-> Requete SQL

$request=mysql_query("select * FROM biens INNER JOIN communes ON biens.id_commune=communes.id_commune INNER JOIN statut_bien ON

statut_bien.code_statut=biens.code_statut INNER JOIN type_biens ON type_biens.code_bien=biens.code_bien WHERE 1=1 

AND biens.id_biens='$id_biens'") OR die(mysql_error());

//<- Fin de Requete

echo '<table class="tableau_gestion">';

echo '<tr>';

echo '<th>ID bien</th>';

echo '<th>Type de bien</th>';

echo '<th>Statut du bien</th>';

while ($donnees=mysql_fetch_array($request)) //On fait une boucle pour lister les biens

{

echo '</tr>';

echo '<tr>';

echo '<td><a href="images.php?id_biens='.$donnees['id_biens'].'">'.$donnees['id_biens'].'</td>';

echo '<td>'.$donnees['type_bien'].'</a></td>';

echo '<td>'.$donnees['statut_bien'].'</td>';

echo '</tr>';

}

echo '</table>';

}

//-> Affichage des images sur base du tableau

if(isset($_GET['id_biens']))

{

$id_biens=$_GET['id_biens'];

echo vignettes($id_biens); //Appel de la fonction pour afficher les vignettes des images

echo '<FORM action="'.$_SERVER['PHP_SELF'].'" method="POST">';

echo '<br />';

echo '<span id="leschamps_4"><a href="javascript:create_champ(4)">Ajouter une image</a></span><noscript><a href="http://www.editeurjavascript.com/">ajax</a></noscript>

';

echo '</FORM>';

}

 

?>

[/code] 

 
Par Cyrano -  Le 08/08/2010 - 

Salut Paintbox,

Je crains que ton code ne m'aide pas des masses. Au passage, dans la barre d'outil du forum, il y un un petit logo « <> » pour insérer du code, sélectionne le langage correspondant, ce sera plus facile à lire et surtout, ça gardera la mise en forme.

Ceci étant, j'ai l'impression qu'il y a un point que tu n'as peut-être pas bien assimilé : le JavaScript est un langage client, le PHP est un langage serveur. Ça veut dire qu'il n'y a aucune interaction directe entre les deux, chacun s'exécutant sur une machine différente, le serveur pour le PHP, la machine de l'internaute pour le JavaScript. Par conséquent, lorsque ton formulaire est envoyé au serveur, le JavaScript n'intervient plus et perd toute information sur la page, page qu'on est en fait en train de quitter. Pour retrouver une valeur depuis le serveur dans le JavaScript de la page qui se charge, il te faut dans ce cas envoyer un code depuis le serveur incluant du code JavaScript dans lequel on crée une variable avec pour valeur une variable PHP. Illustration :

Inclusion de code JavaScript avec variable dynamique
  1. <?php
  2. $uneVariable = "Une valeur quelconque";
  3. $code_js = <<<CODE_JS
  4. <script type="application/javascript">/* <![CDATA[ */
  5. var ma_variable_js = '{$uneVariable}';
  6. /* ]]> */</script>
  7.  
  8. CODE_JS;
  9. echo($code_js);
  10. ?>

Et là, tu peux voir que coté serveur, je prépare une variable. Ensuite je prépare une autre variable qui va contenir le code JavaScript à envoyer vers le navigateur. Ce code JS contient lui-même une variable dont la valeur est préparée par PHP coté serveur. Une fois la page chargée dans le navigateur, en faisant afficher la source, tu vas trouver ceci :

Le code arrivant coté client
  1. <script type="application/javascript">/* <![CDATA[ */
  2. var ma_variable_js = 'Une valeur quelconque';
  3. /* ]]> */</script>

Voilà, partant de là, peut-être pourrais-tu reformuler ta question parce que je ne saisis pas bien ce que tu veux faire en JavaScript avec le nom du fichier... ;-)

 

 

 
Par paintbox -  Le 08/08/2010 - 

Hello Cyrano,

 merci pour tes explications. Je n'avais effectivement pas saisi que le Javascript s'exécute coté client (il me reste encore beaucoup de choses à assimiler mais je ne perds pas espoir).

En fait ce à quoi je souhaite arriver est qu'à partir d'un formulaire qui sert à encoder (en back-office) les différentes données sur le produit, qu'on puisse également enregistre un nombre x d'images. En gros que l'utilisateur puisse mettre un nombre non limité (avec un maximum malgré tout) d'images. Ce qui était pratique avec ce script Javascript, c'est qu'à partir d'un simple lien "ajouter une image", il rajoutait un bouton "choisir un fichier".  C'est l'utilisateur qui choisit le nombres d'images qu'il souhaite mettre su cette fiche.

 Je ne vois pas trop comment en PHP générer en cliquant sur un simple lien, un nouveau bouton "choisir un fichier". De plus, il faut que je rajoute une variable compteur qui intervient dans le nom qu'aura le fichier sur le serveur. 

 Jusque là je limitais à 5 le nombre d'images à charger. 

 Peut-être une fonction "créér un input type='file' " serait une piste ? 

As-tu une idée, une piste? 

 
Par Cyrano -  Le 08/08/2010 - 

Ok, là je saisis mieux la nature de ton problème.

Demande-toi ce que reçoit le serveur lorsque tu soumets le formulaire ? Des données $_POST,  et éventuellement des données $_FILE. Pour ce dernier cas, tu as des identifiants de champ à utiliser pour traiter chaque image individuellement. Il faut donc que tu aies une manière de nommer dynamiquement les champs générés coté client en JavaScript de façon à pouvoir les reconstruire et les traiter coté serveur. La super-globale te permet au départ de savoir combien de fichiers sont reçus. Là, on parle de nombre : alors utilisons des nombres : suppose que le premier champ de type «file» de ton formulaire ait pour attribut name la valeur img_produit_1. Si tu fais générer un nouveau champ coté client, il serait pratique de le nommer img_produit_2, puis au besoin img_produit_3, etc...

Coté serveur, tu commences par récupérer le nombre d'images reçues. Ensuite, tu construis dynamiquement le nom dans une boucle commençant à 1 jusqu'au nombre d'image.

Éventuellement dans tes tests dans la page de traitement, utilise la fonction var_dump pour afficher ce qui est reçu en mettant par exemple :

  1. <?php
  2. //...
  3. echo('<pre>' . "\n");
  4. var_dump($_FILE);
  5. echo('</pre>' . "\n");

 

 Ajoute quelques champs avec ta fonction JavaScript et soumets le formulaire, puis regarde ce que tu obtiens de l'autre coté.

Ça devrait te permettre d'avancer pas mal ;-) 

 

 
Par paintbox -  Le 15/08/2010 - 

 

Hello Cyrano,

 

je reviens avec mon problème. J'ai réussi à récupérer et afficher les informations concernant mes fichiers uploadés via un " foreach($_FILES as $nom_champ => $fichier)". A ce niveau cela fonctionne. 

 

Par contre, lorsque je veux traiter mon image càd vérifier son extension, son poids et la sauvegarder à l'aide de ma fonction "ajout_images", j'ai un message d'erreur "Undefined index: file". C'est visiblement au niveau de ma boucle "for ($i=0; $i<count($_FILES['file']['name']); $i++)" de cette même fonction où je dois sans doute mal récupérer le contenu de mon fichier? Je ne comprends pas pourqoi, alors que quand je fais un "print_r($_FILES)", le contenu s'affiche correctement.

 

J'avoue que la façon de nommer le champ file en Javascript me perturbe un peu. Je pense que ce doit être là que je fais une erreur mais je ne vois pas trop quoi?

 

As-tu une idée et surtout sais-tu me donner une explication?

 

Merci pour ton aide. Voici mon code:

 

  1. <?php
  2. ?>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  7. <title>Document sans nom</title>
  8.  
  9. <script>
  10. function create_champ(i) {
  11.  
  12. var i2 = i + 1;
  13.  
  14. document.getElementById('leschamps_'+i).innerHTML = '<span><input type="file" name="file_'+i+'"><input type="submit" name="upload" value="upload"><br /><br /></span>';
  15.  
  16. document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<br /><span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un champs</a></span>' : '';
  17. }
  18. </script>
  19.  
  20. </head>
  21.  
  22. <body>
  23. <?php
  24. include('connex.inc.php');
  25. $idcom=connex('new_immo', 'myparam');
  26.  
  27. //-> Récupération des l'id de la recherche: Variable GET
  28. if(isset($_GET['id_biens']))
  29. {
  30. echo '<p>Rechecrhe</p>';
  31. $id_biens =$_GET['id_biens'];
  32. $type_bien =$_GET['type_bien'];
  33. $_SESSION['id_biens'] =$id_biens;
  34. $_SESSION['type_bien'] =$type_bien;
  35. echo '<p>Les données sont :</p>';
  36. echo $id_biens.'<br />';
  37. echo $type_bien.'<br />';
  38. }
  39. //-> 1° Test Si le formulaire Upload pour chargement d'images à été soumis
  40. if(empty($_FILES['file']))
  41. {
  42. $id_biens =$_SESSION['id_biens'];
  43. $bien =$_SESSION['type_bien'];
  44. echo $bien;
  45. ajout_image($bien);
  46. echo '<p>Premier chargement</p>';
  47. /* ajout_image($bien); */
  48. foreach($_FILES as $nom_champ => $fichier)
  49. {
  50. ajout_image($bien);
  51.  
  52. //Affichage des infos sur le(s) fichiers téléchargés.
  53. echo '<b>Champ '.$nom_champ.' :</b><br />';
  54. echo 'Nom : '.$fichier['name'].'<br />';
  55. echo 'Type mime : '.$fichier['type'].'<br />';
  56. echo 'Taille : '.$fichier['size'].' octets<br />';
  57. echo 'Nom du fichier temporaire : '.$fichier['tmp_name'].'<br /><br /><br />';
  58. echo '<p>TEST</p>';
  59. }
  60. vignettes($id_biens); //Appel de la fonction pour afficher les vignettes des images
  61. bouton_ad_image();
  62. }
  63. else
  64. {
  65. echo '<p>Il n\'y a pas d\'upload d\'images</p>';
  66. vignettes($id_biens); //Appel de la fonction pour afficher les vignettes des images
  67. bouton_ad_image();
  68.  
  69. }
  70.  
  71.  
  72. //Fonctions
  73. //--------
  74. function vignettes($id_biens)
  75. {
  76. //Requete : lit les images depuis la BD
  77. $sql_images=mysql_query("SELECT images.chemin_image FROM images INNER JOIN biens ON images.id_biens=biens.id_biens
  78. WHERE images.id_biens='$id_biens'") or die(mysql_error());//Requete spéciale pour l'affichage des différentes images
  79. $nbImages = mysql_num_rows($sql_images); //Calcul du nombre total d'images
  80. $i=0; //Compteur
  81. //Affichage des images trouvées
  82. echo '<p>Nombre d\'images trouvées : '.$nbImages.'<p/>';
  83. echo '<table>';
  84. echo '<tr>';
  85. while($donnees=mysql_fetch_array($sql_images))
  86. {
  87. /* $image='../'; *///Permet de remonter d"un niveau de Admin au dossier des images
  88. $image =$donnees['chemin_image'];
  89. $h_vign = "100";
  90. $taille = getimagesize($image);
  91. $reduc = floor(($h_vign*100)/($taille[1]));
  92. $l_vign = floor(($taille[0]*$reduc)/100);
  93. echo '<td>';
  94. $rang_image=$i;
  95. echo '<img src="'.$image.'" width="'.$l_vign.'" height="'.$h_vign.'">';
  96. echo '<br />';
  97. echo '<FORM action="" method="POST">';
  98. echo '<label>Rang : '.$i;
  99. echo '<br /><input type="submit" name="choix" value="supprimer" id="'.$i.'"/>';
  100. echo '<p>Rang image = '.$rang_image.'</p>';
  101. echo '</FORM>';
  102. echo '<br />';
  103. echo '</td>';
  104. $i++; //Incrémentation du compteur
  105. }
  106. echo '</tr>';
  107. echo '</table>';
  108. echo '<br />';
  109. }
  110.  
  111.  
  112. function ajout_image($bien)
  113. {
  114. print_r($_FILES);
  115. echo '<p>Bien :'.$_SESSION['type_bien'].'</p>';
  116. $image_id =mysql_insert_id(); //->Récupération de l'id du dernier enregistrement
  117. $dossier =strtolower($_SESSION['type_bien']); //->Récupération du type de bien pour nom de dossier
  118. $dossier .=$image_id; //->Ajout du numéro du dernier enregistrement
  119. $dossier .='../images/'.$dossier;
  120. if (!isset($dossier))
  121. {
  122. mkdir("$dossier", 0700); //->Création du dossier pour ce nouveau bien
  123. $content_dir ='../images/'; //->Dossier où sera copié le fichier
  124. $content_dir .=$dossier;
  125. }
  126. if(isset($_POST['upload'])) //->Test Si le formulaire à été soumis
  127. {
  128. echo '<p>Ok image chargée</p>';
  129. for ($i=0; $i<count($_FILES['file']['name']); $i++)
  130. {
  131. $new_name =strtolower($_POST['bien']);//->Récupération du type de bien pour nom de l'image
  132. $new_name .=$image_id; //->Retourne l'id du dernier enregistrement
  133. $new_name .="-";
  134. $name_file =$_FILES['file']['name'][$i];
  135. if (preg_match('#[\x00-\x1F\x7F-\x9F/\\\\]#', $name_file))//->Vérification du nom de fichier
  136. {
  137. exit ("Nom de fichier non valide");
  138. }
  139. $tmp_file=$_FILES['file']['tmp_name'][$i];
  140. if(!is_uploaded_file($tmp_file))
  141. {
  142. exit("Le fichier est introuvable");
  143. }
  144. //On verifie maintenant l extension de l'image
  145. $type_file=$_FILES['file']['type'][$i];
  146. if(!strstr($type_file, 'jpg')&& !strstr($type_file, 'jpeg')&& !strstr($type_file, 'bmp')&& !
  147. strstr($type_file,'gif'))
  148. {
  149. exit("Le fichier n'est pas une image");
  150. }
  151. //On copie le fichier dans le dossier de destination en
  152. //lui donnant un nouveau nom (bien+N° enregistrement)
  153. $name_file =$content_dir.$_FILES['file']['name'][$i];
  154. $ext =strtolower(pathinfo($name_file, PATHINFO_EXTENSION));//->Permet de récupérer l'extension du fichier
  155. $chemin_image =$content_dir."/".$new_name.$i.".".$ext;
  156. //On insère l'image principale dans la table images en indiquant
  157. //le numéro de biens correspondant dans la BD ainsi que son ordre d'apparition
  158. if($_FILES['file'])
  159. {
  160. $new_name.="$i";
  161. mysql_query("INSERT INTO images VALUES ('','".$image_id."', '".$chemin_image."', '1','".$i."')") or die(mysql_error());
  162. echo '<p>Image enregistrée dans DB</p>';
  163. }
  164. if(!move_uploaded_file($tmp_file, $chemin_image)) //->Copie les fichiers dans le bon répertoire
  165. {
  166. exit ("Impossible de copier le fichier dans $content_dir");
  167. }
  168. echo "Le fichier a bien été uploadé<br />";
  169. echo "Le chemin d'accès est : ".$chemin_image."<br />";
  170. echo '<p>***************************************</p>';
  171. }
  172. }
  173. }
  174.  
  175. function bouton_ad_image() //->Affiche le lien nouvel image
  176. {
  177. echo '<FORM action="'.$_SERVER['PHP_SELF'].'" method="POST" name="upload" enctype="multipart/form-data">';
  178. echo '<br />';
  179. $id_biens=$_GET['id_biens'];
  180.  
  181. echo '<span id="leschamps_0"><a href="javascript:create_champ(0)">Ajouter une image</a></span>
  182. <noscript> <a href="http://www.editeurjavascript.com/">ajax</a>
  183. </noscript>';
  184. echo '</FORM>';
  185. }
  186. $_SESSION['id_biens']=$id_biens;
  187.  
  188.  
  189. ?>
  190.  
  191.  
  192. </body>
  193. </html>

 

 

 

 
Par Cyrano -  Le 15/08/2010 - 

Salut Paintbox,

as-tu utilisé le petit bout de code que je t'ai suggéré ?

Débogage
  1. <?php
  2. echo("<pre>\n");
  3. var_dump($_FILES);
  4. echo("</pre>\n");

Si oui, qu'as-tu vu s'afficher ? Ce que j'essaye de te faire voir, c'Est que peut-être bien que tu ne comptes pas le bon élément.

Par ailleurs, habitue-toi à optimiser ton code : au lieu de

  1. <?php
  2. //...
  3. for ($i=0; $i<count($_FILES['file']['name']); $i++)

Écris plutôt :

Le même optimisé
  1. <?php
  2. //...
  3. $nf = count($_FILES['file']['name']);
  4. for ($i = 0; $i < $nf; $i++)

Quelle différence me demanderas-tu peut-être ? Tout simplement le le comptage dans le second exemple n'est effectué qu'une seule fois et on utilise seulement le résultat dans la boucle. Dans ton code, la fonction count() est exécutée à chaque tour de boucle. S'il doit y avoir 10000 tours, il y aura 10000 exécution de count(). Sur quelques tours, ce n'est certes pas significatif, mais sur l'ensemble d'une application, quelques fractions de secondes ici et là et on ralentit l'ensemble de façon parfois notable.

 

 

Enfin, sois logique dans la disposition de ton code : là, tu définis ta page et ensuite tu ajoutes les fonctions : n'oublie pas que le code est lu du début à la fin. Si tu fais un appel à une fonction avant que celle-ci ne soit définie, tu vas avoir des erreurs. Je suggère d'ailleurs que tu mettes tes fonctions dans des fichiers externes et que tu les insères lorsque c'est nécessaire, exactement de la même manière que tu fais une inclusion de ton code de connexion à la base de données.

 
Par paintbox -  Le 15/08/2010 - 

Hello Cyrano,

 

oui effectivement j'ai directement mis les fonctions sur cette page parce que ces fonctions sont également utilisées par d'autres pages, et je voulais éviter de tout modifier. Je sui d'accord avec toi, c'est plus facile et propre avec un import de fonction. Quand à l'ordre effectivement j'ai inversé mais c'était pour tester et j'ai oublié de remettre mes fonctions en début de code.

 

Oui j'ai essayé ton bout de code :

  1. <?php
  2. echo("<pre>\n");
  3. var_dump($_FILES);
  4. echo("</pre>\n");

il me retourne ceci comme résultat:

  1. array(1) {
  2. ["file_0"]=>
  3. array(5) {
  4. ["name"]=>
  5. string(14) "maison_025.JPG"
  6. ["type"]=>
  7. string(10) "image/jpeg"
  8. ["tmp_name"]=>
  9. string(36) "/Applications/MAMP/tmp/php/phpnHo91s"
  10. ["error"]=>
  11. int(0)
  12. ["size"]=>
  13. int(60773)
  14. }
  15. }

 

Je me rends bien compte que mon imput type="file" dans le Scrip Java se nomme ' name="file_'+i+'" ' . J'ai essayé de changer le 

  1. $_FILES['file']['name']

 

en

  1. $_FILES['file_']['name']

 

mais cela ne change rien.

 En même temps, ton var_dump($FILES) montre bien que $FILES n'est pas vide.

 Je ne vois pas ? 

 

 

 
Par Cyrano -  Le 15/08/2010 - 

Ok, comment boucluer sur un tableau dont on ne connait pas le nom exact de l'index de premier niveau ? Au lieu d'utiliser une boucle for(),  utilises foreach().

On peut aunsi écrire :

Boucle foreach
  1. <?php
  2. foreach($_FILES as $index => $valeur)
  3. {
  4. //....
  5. }

Ainsi, tu n'as pas besoin de savoir le nom exact de l'index, il sera dynamiquement retrouvé. Pas besoin de compteur non plus puisque la boucle foreach s'arrêtera lorsqu'il n'y aura plus d'élément.

Ici dans l'exemple, $index prendra donc la valeur de  'file_0' puis au tour suivant s'il y en a un 'file_1'. Mais si cet index s'appelait 'toto', ça marcherait pareil et lesuivant titi, même chose. Donc dans la boucle, on peut travailler sur un fichier à partir de $_FILES[$index] qui est également un tableau contenant les index name, type, tmp_name, error et size. Et en fait, c'Est la même chose que ce qu'il y a dans $valeur qui prend effectivement la valeur correspondant à l'index $index.

Je me doute que ce n'est peut-être pas très clair, enrichissons donc un peu l'exemple :

  1. <?php
  2. echo("<pre>\n");
  3. var_dump($_FILES);
  4. echo("</pre>\n");
  5. foreach($_FILES as $index => $valeur)
  6. {
  7. $tmp_file1 = $_FILES[$index]['tmp_name'];
  8. echo("<pre>Nom temporaire du fichier, première méthode :\n");
  9. var_dump($tmp_file1);
  10. echo("</pre>\n");
  11. // Ou bien encore :
  12. $tmp_file2 = $valeur['tmp_name'];
  13. echo("<pre>Nom temporaire du fichier, seconde méthode :\n");
  14. var_dump($tmp_file2);
  15. echo("</pre>\n---------\n");
  16. }

Adapte ça (il est quasiment utilisable tel quel) et teste le, observe le résultat.

 

 

Ajouter une réponse à la discussion

Seuls les membres loggués sont autorisés à poster dans les forums !