Page 1 sur 1

Problème Récupération de variable

Posté : 22 nov. 2006, 12:33
par dunbar
Bonjour,

J'essaye de faire une boucle pour un INSERT mais je me plante quelque part et je ne trouve pas ou ?
L'erreur est qu'il ne prend qu'un seul enregistrement et pas les 3
for ($x=1;$x<=$maxfiles;$x++)
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());

  //=============================================================================
  //  TEST DU NOMBRE DE FICHIERS POSTES
  //=============================================================================
  $nbr=0;
  for($x=0;$x<$maxfiles;$x++)
    if(!empty($_FILES['userfile']['name'][$x])) $nbr++;
  if($nbr<=0) die("Aucun fichier spécifié !<br/>");

  //=============================================================================
  //  CREATION DE L'ARBORESCENCE POUR LE DOSSIER DESTINATION
  //=============================================================================
  if(!empty($finaldir)) {
     if(substr($finaldir,strlen($finaldir)-1,1)=='/') $finaldir.='/';
     $dir=explode('/',$finaldir);
     $finaldir='';
     for($x=0;$x<count($dir);$x++) {
        $finaldir.=$dir[$x].'/';
        if(!@is_dir($finaldir)) @mkdir($finaldir,0777);
     }
     if(!@is_dir($finaldir)) die("Le dossier $finaldir est invalide !<br/>");
  }

  //=============================================================================
  //  TELECHARGEMENT DES FICHIERS
  //=============================================================================
  for($x=1;$x<=$maxfiles;$x++) {
    $errorhttp=$_FILES['userfile']['error'][$x-1];
    $filenamehttp=$_FILES['userfile']['name'][$x-1];
    $typehttp=$_FILES['userfile']['type'][$x-1];
    $sizehttp=$_FILES['userfile']['size'][$x-1];
    $tmpfilehttp=$_FILES['userfile']['tmp_name'][$x-1];
    if (($errorhttp)and(!empty($filenamehttp))) {
      switch ($errorhttp){
        case 1: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 2: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 3: echo "Erreur : Transfert du fichier n°$x interrompu !<br/>";break;
        case 4: echo "Erreur : Le fichier n°$x est vide !<br/>";break;
      }
    } else {
      if((!empty($filenamehttp))and($sizehttp>0)) {
        if($sizehttp<=$maxsize){
          if(@is_uploaded_file($tmpfilehttp)) {
             if(@eregi('.php',$filenamehttp)) $filenamehttp.='.txt';
             if(@eregi('.exe',$filenamehttp)) $filenamehttp.='.txt';
             if(filesize($tmpfilehttp)==$sizehttp) {
               if(@move_uploaded_file($tmpfilehttp,$finaldir.$filenamehttp)) {
                  @chmod($filenamehttp,0777);
                  echo "Fichier n°$x uploadé : ".basename($filenamehttp).
                       " (".round(max($sizehttp,1024)/1024)." ko)<br/>";
               } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
             } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
          } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
        } else echo "Erreur : Le fichier n°$x est trop grand !<br/>";
      } // else echo "Le fichier n°$x est introuvable ou vide !<br/>";
    }
  }

  die ("Opération terminée.<br/>");
}
Quelqu'un voie t'il l'erreur :?:
D'avance merci :wink:

Posté : 22 nov. 2006, 12:37
par DocType
Faudrait nous donner l'erreur que ton script affiche :wink:

Posté : 22 nov. 2006, 12:41
par dunbar
Faudrait nous donner l'erreur que ton script affiche :wink:
Ok sorry j'avais oublier les {}
ici
for ($x=1;$x<=$maxfiles;$x++){
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());
}
Merci

Posté : 22 nov. 2006, 12:43
par Ryle
Il ne manquerait pas des accolades à ton premier for() ? Sans elles, c'est la première instruction uniquement qui sera exécutée, et il va boucler sur le $sql = "...";

Méfies toi ensuite, si tu imbriques tes deux for(), change le nom de la variable $x pour le second, sinon il te l'incrémentera et ta valeur sera faussée dans le premier :)

Edit : Damn ! c'était bien la peine que ducrot il se décarcasse ;)

Posté : 22 nov. 2006, 12:49
par dunbar
Il ne manquerait pas des accolades à ton premier for() ? Sans elles, c'est la première instruction uniquement qui sera exécutée, et il va boucler sur le $sql = "...";

Méfies toi ensuite, si tu imbriques tes deux for(), change le nom de la variable $x pour le second, sinon il te l'incrémentera et ta valeur sera faussée dans le premier :)

Edit : Damn ! c'était bien la peine que ducrot il se décarcasse ;)
Sorry, et merci pour ma 2 boucle :wink:

A+

Posté : 22 nov. 2006, 13:11
par Ryle
Bah ce n'est pas utile de le modifier du coup, puisque le 2ème for() n'est pas imbriqué dans le premier :)
C'était ton indentation qui le laissait présumer, et comme je ne savais pas où tu allais fermer ta boucle .. :)

Posté : 22 nov. 2006, 13:27
par dunbar
Il ne manquerait pas des accolades à ton premier for() ? Sans elles, c'est la première instruction uniquement qui sera exécutée, et il va boucler sur le $sql = "...";

Méfies toi ensuite, si tu imbriques tes deux for(), change le nom de la variable $x pour le second, sinon il te l'incrémentera et ta valeur sera faussée dans le premier :)

Edit : Damn ! c'était bien la peine que ducrot il se décarcasse ;)
Sorry, et merci pour ma 2 boucle :wink:

A+
Alors ma boucle fonction presque bien :oops:
for ($s=1;$s<=$maxfiles;$s++){
	if (($finaldir.$s != '')){
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());
}
}
La variable $maxfiles est actuellement sur trois, j'ai donc la possibilité de télécharger trois fichiers mais 2 ou 1 éventuellement et comme ma boucle reprend la variable $maxfile elle inscrit trois enregistrement dans ma table et cela que je charge 1,2 ou 3 fichiers comment lui dire de ne prendre que le nombre de fichier réel :?:

Merci d'avance

Récupération de variable

Posté : 22 nov. 2006, 14:44
par dunbar
Pourquoi je n'arrive pas à récupérée le nom de mon fichier ???
Il m'indique array dans le champ nom de ma table ?
$maxfiles       = 3;                          //Modification du nombre de Photo.
$maxsize        = 2000000;                    //Poid des Photos
$finaldir       = 'E:/wamp/www/xxxx/clients/images/'; //Chemin du repertoire
$name           = $_FILE['userfile'][0];
//===============================================================================
//  TRAITEMENT DU FORMULAIRE
//===============================================================================
if(isset($_POST['valider'])){

//===============================================================================
//
//  ENREGISTREMENT DU CHEMIN ET NOM DANS LA TABLE IMAGE
//
//===============================================================================

include "../connect/connect.php";

$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());



  //=============================================================================
  //  TEST DU NOMBRE DE FICHIERS POSTES
  //=============================================================================
  $nbr=0;
  for($x=0;$x<$maxfiles;$x++)
    if(!empty($_FILES['userfile']['name'][$x])) $nbr++;
  if($nbr<=0) die("Aucun fichier spécifié !<br/>");

  //=============================================================================
  //  CREATION DE L'ARBORESCENCE POUR LE DOSSIER DESTINATION
  //=============================================================================
  if(!empty($finaldir)) {
     if(substr($finaldir,strlen($finaldir)-1,1)=='/') $finaldir.='/';
     $dir=explode('/',$finaldir);
     $finaldir='';
     for($x=0;$x<count($dir);$x++) {
        $finaldir.=$dir[$x].'/';
        if(!@is_dir($finaldir)) @mkdir($finaldir,0777);
     }
     if(!@is_dir($finaldir)) die("Le dossier $finaldir est invalide !<br/>");
  }

  //=============================================================================
  //  TELECHARGEMENT DES FICHIERS
  //=============================================================================
    for($x=1;$x<=$maxfiles;$x++) {
    $errorhttp=$_FILES['userfile']['error'][$x-1];
    $filenamehttp=$_FILES['userfile']['name'][$x-1];
    $typehttp=$_FILES['userfile']['type'][$x-1];
    $sizehttp=$_FILES['userfile']['size'][$x-1];
    $tmpfilehttp=$_FILES['userfile']['tmp_name'][$x-1];
    if (($errorhttp)and(!empty($filenamehttp))) {
      switch ($errorhttp){
        case 1: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 2: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 3: echo "Erreur : Transfert du fichier n°$x interrompu !<br/>";break;
        case 4: echo "Erreur : Le fichier n°$x est vide !<br/>";break;
      }
    } else {
      if((!empty($filenamehttp))and($sizehttp>0)) {
        if($sizehttp<=$maxsize){
          if(@is_uploaded_file($tmpfilehttp)) {
             if(@eregi('.php',$filenamehttp)) $filenamehttp.='.txt';
             if(@eregi('.exe',$filenamehttp)) $filenamehttp.='.txt';
             if(filesize($tmpfilehttp)==$sizehttp) {
               if(@move_uploaded_file($tmpfilehttp,$finaldir.$filenamehttp)) {
                  @chmod($filenamehttp,0777);
                  echo "Fichier n°$x uploadé : ".basename($filenamehttp).
                       " (".round(max($sizehttp,1024)/1024)." ko)<br/>";
               } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
             } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
          } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
        } else echo "Erreur : Le fichier n°$x est trop grand !<br/>";
      } // else echo "Le fichier n°$x est introuvable ou vide !<br/>";
    }
  }

  die ("Opération terminée.<br/>");
}

//===============================================================================
//  FORMULAIRE HTML
//===============================================================================
echo '<form method="post" enctype="multipart/form-data"'.
     ' onSubmit="document.getElementById(\'valider\').style.visibility=\'hidden\';">'.
     '<input type="hidden" name="MAX_FILE_SIZE" value="'.$maxsize.'"/>';
for($x=1;$x<=max($maxfiles,1);$x++)
  echo ' Fichier n°'.$x.' : <input type="file" name="userfile[]" size="20"/><br/>';
echo '<br/><input type="submit" name="valider" value="Envoyer..."/>'.
     '</form>';


//===============================================================================



?>
:oops: Merci d'avance

Posté : 22 nov. 2006, 18:48
par Ryle
Alors dans l'ordre :
Alors ma boucle fonction presque bien :oops:
for ($s=1;$s<=$maxfiles;$s++){
	if (($finaldir.$s != '')){
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());
}
}
La variable $maxfiles est actuellement sur trois, j'ai donc la possibilité de télécharger trois fichiers mais 2 ou 1 éventuellement et comme ma boucle reprend la variable $maxfile elle inscrit trois enregistrement dans ma table et cela que je charge 1,2 ou 3 fichiers comment lui dire de ne prendre que le nombre de fichier réel :?:
En fait, dans ton code la valeur de $s va être 1, 2 ou 3 et ne sera donc jamais vide. Ainsi, si tu la concatène à la chaine $finaldir, même si cette derniere est vide, le résultat ne le sera pas et tu rentreras 3 fois dans le if pour exécuter la requête :)


Pour ton nom de fichier, utilise la fonction print_r() sur ton tableau voire sur $_FILES. Tu verras ainsi comment il est structuré (index et sous-tableaux), et tu comprendras surement pourquoi il te retourne un tableau (Array) au lieu de la valeur attendue :)

Posté : 22 nov. 2006, 19:42
par dunbar
Alors dans l'ordre :
Alors ma boucle fonction presque bien :oops:
for ($s=1;$s<=$maxfiles;$s++){
	if (($finaldir.$s != '')){
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());
}
}
La variable $maxfiles est actuellement sur trois, j'ai donc la possibilité de télécharger trois fichiers mais 2 ou 1 éventuellement et comme ma boucle reprend la variable $maxfile elle inscrit trois enregistrement dans ma table et cela que je charge 1,2 ou 3 fichiers comment lui dire de ne prendre que le nombre de fichier réel :?:
En fait, dans ton code la valeur de $s va être 1, 2 ou 3 et ne sera donc jamais vide. Ainsi, si tu la concatène à la chaine $finaldir, même si cette derniere est vide, le résultat ne le sera pas et tu rentreras 3 fois dans le if pour exécuter la requête :)


Pour ton nom de fichier, utilise la fonction print_r() sur ton tableau voire sur $_FILES. Tu verras ainsi comment il est structuré (index et sous-tableaux), et tu comprendras surement pourquoi il te retourne un tableau (Array) au lieu de la valeur attendue :)
Concernant le nom du fichier je ne comprend vraiment pas il me retourne ceci comme erreur
Array ( [userfile] => Array ( [name] => Array ( [0] => IMG_0042.jpg [1] => [2] => [3] => [4] => ) [type] => Array ( [0] => image/pjpeg [1] => [2] => [3] => [4] => ) [tmp_name] => Array ( [0] => E:/wamp/tmp\php2A8.tmp [1] => [2] => [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 1551705 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) ) Fichier n°1 uploadé : IMG_0042.jpg (1515 ko)
Opération terminée.
Quand à la boucle tu concatenerais avec quelle valeur si $filename est pas bonne ?
:?: Merci

Posté : 23 nov. 2006, 10:15
par dunbar
Alors dans l'ordre :
Alors ma boucle fonction presque bien :oops:
for ($s=1;$s<=$maxfiles;$s++){
	if (($finaldir.$s != '')){
$sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
$insert = mysql_query($sql) or die (mysql_error());
}
}
La variable $maxfiles est actuellement sur trois, j'ai donc la possibilité de télécharger trois fichiers mais 2 ou 1 éventuellement et comme ma boucle reprend la variable $maxfile elle inscrit trois enregistrement dans ma table et cela que je charge 1,2 ou 3 fichiers comment lui dire de ne prendre que le nombre de fichier réel :?:
En fait, dans ton code la valeur de $s va être 1, 2 ou 3 et ne sera donc jamais vide. Ainsi, si tu la concatène à la chaine $finaldir, même si cette derniere est vide, le résultat ne le sera pas et tu rentreras 3 fois dans le if pour exécuter la requête :)


Pour ton nom de fichier, utilise la fonction print_r() sur ton tableau voire sur $_FILES. Tu verras ainsi comment il est structuré (index et sous-tableaux), et tu comprendras surement pourquoi il te retourne un tableau (Array) au lieu de la valeur attendue :)
Concernant le nom du fichier je ne comprend vraiment pas il me retourne ceci comme erreur
Array ( [userfile] => Array ( [name] => Array ( [0] => IMG_0042.jpg [1] => [2] => [3] => [4] => ) [type] => Array ( [0] => image/pjpeg [1] => [2] => [3] => [4] => ) [tmp_name] => Array ( [0] => E:/wamp/tmp\php2A8.tmp [1] => [2] => [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 1551705 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) ) Fichier n°1 uploadé : IMG_0042.jpg (1515 ko)
Opération terminée.
Quand à la boucle tu concatenerais avec quelle valeur si $filename est pas bonne ?
:?: Merci
Quelqu'un aurais t'il une idée ?

Posté : 23 nov. 2006, 10:45
par Ryle
En fait, l'idéal serait de ne pas boucler de 1 à 3, mais du nombre de fichier contenu dans $_FILES (quitte à s'arrêter avec un break s'il y en a plus de 3). Comme ça s'il n'y en a qu'un tu n'en fais qu'un, s'il y en a deux tu n'en fais que 2 etc.

Pour voir le tableau un peu mieux présenté, utilise les tags <pre> quand tu fais le print_r :
echo '<pre>';
print_r($tableau);
echo '</pre>';
Le résultat sera plus clair et tu verras combien il y a de tableaux, de sous tableaux, d'éléments dedans, leurs index et leurs valeurs :

Code : Tout sélectionner

Array ( [userfile] => Array ( [name] => Array ( [0] => IMG_0042.jpg [1] => [2] => [3] => [4] => ) [type] => Array ( [0] => image/pjpeg [1] => [2] => [3] => [4] => ) [tmp_name] => Array ( [0] => E:/wamp/tmp\php2A8.tmp [1] => [2] => [3] => [4] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 ) [size] => Array ( [0] => 1551705 [1] => 0 [2] => 0 [3] => 0 [4] => 0 ) ) )
Tu vois ainsi qu'avec un foreach sur $_FILES['userfile'] tu verras tous les fichiers sous forme de tableau et tu pourras tester qu'ils ont bien été uploadé, récupérer les noms et les stocker en base, ainsi que déplacer le fichier pour le conserver sur le serveur :)

Posté : 25 nov. 2006, 21:00
par dunbar
Salut,

Je dois être aveugle parce que je n'y arrive pas.
Je récupére bien le chemin mais pour le nom rien à faire ?
Et voilà mon code après les modification que tu me conseil mais cela m'affiche toujours Array.
<?php
//===============================================================================
//
//  UPLOADE
//
//===============================================================================
$maxfiles       = 1;                          //Modification du nombre de Photo.
$maxsize        = 2000000;                    //Poid des Photos
$finaldir       = 'E:/wamp/www/xxxxxx/clients/images/'; //Chemin du repertoire
$nom            = array(1, 2, 3, 4);
//===============================================================================
//  TRAITEMENT DU FORMULAIRE
//===============================================================================
if(isset($_POST['valider'])){

//===============================================================================
//
//  ENREGISTREMENT DU CHEMIN ET NOM DANS LA TABLE IMAGE
//
//===============================================================================

include "../connect/connect.php";

//echo $sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$name."')";
//$insert = mysql_query($sql) or die (mysql_error());

echo $sql = "INSERT INTO images (chem_pho_1, pho_1) values ('".$finaldir."','".$nom."')";
$insert = mysql_query($sql) or die (mysql_error());

?>
 <pre>
<?php
var_dump($_FILES);
?>
</pre>
<?php
  //=============================================================================
  //  TEST DU NOMBRE DE FICHIERS POSTES
  //=============================================================================
  $nbr=0;
  for($x=0;$x<$maxfiles;$x++)
    if(!empty($_FILES['userfile']['name'][$x])) $nbr++;
  if($nbr<=0) die("Aucun fichier spécifié !<br/>");

  //=============================================================================
  //  CREATION DE L'ARBORESCENCE POUR LE DOSSIER DESTINATION
  //=============================================================================
  if(!empty($finaldir)) {
     if(substr($finaldir,strlen($finaldir)-1,1)=='/') $finaldir.='/';
     $dir=explode('/',$finaldir);
     $finaldir='';
     for($x=0;$x<count($dir);$x++) {
        $finaldir.=$dir[$x].'/';
        if(!@is_dir($finaldir)) @mkdir($finaldir,0777);
     }
     if(!@is_dir($finaldir)) die("Le dossier $finaldir est invalide !<br/>");
  }

  //=============================================================================
  //  TELECHARGEMENT DES FICHIERS
  //=============================================================================

  foreach($_FILES as $Key => $Value) {
    for($x=1;$x<=$maxfiles;$x++) {
    $errorhttp=$_FILES['userfile']['error'][$x-1];
    $filenamehttp=$_FILES['userfile']['name'][$x-1];
    $typehttp=$_FILES['userfile']['type'][$x-1];
    $sizehttp=$_FILES['userfile']['size'][$x-1];
    $tmpfilehttp=$_FILES['userfile']['tmp_name'][$x-1];
    if (($errorhttp)and(!empty($filenamehttp))) {
      switch ($errorhttp){
        case 1: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 2: echo "Erreur : Le fichier n°$x est trop grand !<br/>";break;
        case 3: echo "Erreur : Transfert du fichier n°$x interrompu !<br/>";break;
        case 4: echo "Erreur : Le fichier n°$x est vide !<br/>";break;
      }
    } else {
      if((!empty($filenamehttp))and($sizehttp>0)) {
        if($sizehttp<=$maxsize){
          if(@is_uploaded_file($tmpfilehttp)) {
             if(@eregi('.php',$filenamehttp)) $filenamehttp.='.txt';
             if(@eregi('.exe',$filenamehttp)) $filenamehttp.='.txt';
             if(@eregi('.swf',$filenamehttp)) $filenamehttp.='.txt';
             if(@eregi('.zip',$filenamehttp)) $filenamehttp.='.txt';
             if(filesize($tmpfilehttp)==$sizehttp) {
               if(@move_uploaded_file($tmpfilehttp,$finaldir.$filenamehttp)) {
                  @chmod($filenamehttp,0777);
                  echo "Fichier n°$x uploadé : ".basename($filenamehttp).
                       " (".round(max($sizehttp,1024)/1024)." ko)<br/>";
               } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
             } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
          } else echo "Erreur de téléchargement du fichier n°$x !<br/>";
        } else echo "Erreur : Le fichier n°$x est trop grand !<br/>";
      } // else echo "Le fichier n°$x est introuvable ou vide !<br/>";
    }
  }
 }
  die ("Opération terminée.<br/>");
}

//===============================================================================
//  FORMULAIRE HTML
//===============================================================================
echo '<form method="post" enctype="multipart/form-data"'.
     ' onSubmit="document.getElementById(\'valider\').style.visibility=\'hidden\';">'.
     '<input type="hidden" name="MAX_FILE_SIZE" value="'.$maxsize.'"/>';
for($x=1;$x<=max($maxfiles,1);$x++)
  echo ' Fichier n°'.$x.' : <input type="file" name="userfile[]" size="20"/><br/>';
echo '<br/><input type="submit" name="valider" value="Envoyer..."/>'.
     '</form>';


//===============================================================================



?>
Et mon Var_Dump

Code : Tout sélectionner

array(1) { ["userfile"]=> array(5) { ["name"]=> array(1) { [0]=> string(5) "6.gif" } ["type"]=> array(1) { [0]=> string(9) "image/gif" } ["tmp_name"]=> array(1) { [0]=> string(21) "E:/wamp/tmp\phpCD.tmp" } ["error"]=> array(1) { [0]=> int(0) } ["size"]=> array(1) { [0]=> int(2415) } } }
Quelqu'un remarque mon erreur ?

D'avance merci

Posté : 26 nov. 2006, 18:33
par dunbar
Salut

Donc en gros ma question est simplement pourquoi (quelle erreur je fais) je n'arrive pas à avoir le nom de mon fichier :?:

Merci