perdue dans le tableau $_FILES

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 : perdue dans le tableau $_FILES

par Melody Nelson » 29 mai 2009, 10:05

merci Ryle !

je me pose une autre question sur mon script... en fait, j'ai l'impression que je ne l'ai pas construit "logiquement"

en gros, actuellement je lui dis de faire ça :
- s'il y a un fichier -> traite le fichier puis créé l'enregistrement (avec des données "standard" et des infos concernant les fichiers en question)
- sinon -> créé l'enregistrement avec seulement des données "standard"

avec tes lumières sur cette histoire de boucle, j'ai l'impression que mon « if file_exists( bla bla bla) » n'a plus de sens

en fait, dans ma tête (pas très reposée), je voudrais faire :
- soit 2 if pour vérifier s'il y'a 2 fichiers, et suivre la logique que j'utilisais jusque là avec un seul fichier
- soit une boucle pour traiter les fichiers et l'enregistrement, mais dans ce cas je ne vois pas comment lui dire de traiter l'enregistrement même lorsqu'il n'y a pas de fichier

(j'suis pas certaine que mes doutes et explications associées soient super clairs, je vais essayer de revoir ça après avoir dormi !)

EDIT : je crois que finalement utiliser une boucle ne convient pas (bien que je crois que je ne sais pas m'en servir correctement) car j'ai besoin de stocker dans des champs différents les chemins d'accès de mes fichiers téléchargés

par exemple, le chemin du premier fichier soit aller dans le champ X et le chemin du deuxième dans le champ Y

en mettant une boucle dans mon script, je n'arrivais pas à m'en sortir, alors j'ai fait ça à la place (probablement pas très pro mais ça marche, mes excuses aux puristes ! :oops: )
// ETAPE 2 : TRAITEMENT DU PREMIER FICHIER LIE

if (file_exists($_FILES['mon_fichier']['tmp_name'])) {

//echo "<p>il y a un fichier : " . $_FILES['mon_fichier']['tmp_name'] ."</p>";
			
//	variable servant à "stocker" les erreurs lors des différents contrôles
unset($erreur);

//	vérification du type de fichier			
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'PNG', 'GIF', 'JPG', 'JPEG');
			 
	if(!in_array( substr(strrchr($_FILES['mon_fichier']['name'], '.'), 1), $extensions_ok))
		{
		$erreur = "<p id='erreur'>------>Le fichier doit &ecirc;tre de type png, gif ou jpg.</p>";
		echo $erreur;
    	include ("include/actus_ajout_form.inc");
    	}

//	vérification de la taille du fichier
$taille_max = 150000;
    				
//echo "<p>" . $_FILES['mon_fichier']['size'] ." octets</p>";
    				
    if($_FILES['mon_fichier']['size'] > $taille_max)
    	{					    
		$erreur =  "<p id='erreur'>------>Le fichier doit faire moins de 150 ko.</p>";
		echo $erreur;
    	include ("include/actus_ajout_form.inc");				
    	}
    			
//	s'il n'y a pas d'erreur (type et taille), fichier renommé et déplacé
    				
if(!isset($erreur))
    				  		
   {
    					
//	récupère l'extension du fichier original et la transforme en minuscule
//echo "<p>".strtolower(substr(strrchr($_FILES['mon_fichier']['name'], "."), 1)) ."</p>";
$dest_extension = strtolower(substr(strrchr($_FILES['mon_fichier']['name'], "."), 1));
    						
//	récupère le nom du fichier dans le dossier temporaire et le transforme en minuscule
//echo "<p>" .strtolower(substr(strrchr($_FILES['mon_fichier']['tmp_name'], "/"), 1)) ."</p>";
$dest_nom = strtolower(substr(strrchr($_FILES['mon_fichier']['tmp_name'], "/"), 1)) ;
    						
//	contruction du nom complet du fichier qui devra être copié
//echo $dest_nom ."." .$dest_extension ;
$dest_fichier = $dest_nom ."." .$dest_extension ;
    					
//	dossier de destination
$dest_dossier = 'images_actus/';
    						
//	copie du fichier
   					
    	if(move_uploaded_file($_FILES['mon_fichier']['tmp_name'], $dest_dossier .$dest_fichier)) 
				{ 
    			//echo("<p>Fichier copi&eacute; ici : <strong>" .$dest_dossier .$dest_fichier ."</strong></p>"); 
    			chmod($dest_dossier .$dest_fichier, 0777);
				} 
		
		else 
			{ echo("<p>Erreur lors de la copie du fichier t&eacute;l&eacute;charg&eacute;.</p>");}
										

		}	//	FIN traitement et copie du fichier			
    		
} // FIN vérification présence d'un fichier n°1


	
// ETAPE 3 : TRAITEMENT DU DEUXIEME FICHIER LIE

if (file_exists($_FILES['mon_fichier2']['tmp_name'])) {

//echo "<p>il y a un fichier : " . $_FILES['mon_fichier2']['tmp_name'] ."</p>";
			
//	variable servant à "stocker" les erreurs lors des différents contrôles
unset($erreur);

//	vérification du type de fichier			
$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'PNG', 'GIF', 'JPG', 'JPEG');
			 
	if(!in_array( substr(strrchr($_FILES['mon_fichier2']['name'], '.'), 1), $extensions_ok))
		{
		$erreur = "<p id='erreur'>------>Le fichier doit &ecirc;tre de type png, gif ou jpg.</p>";
		echo $erreur;
    	include ("include/actus_ajout_form.inc");
    	}

//	vérification de la taille du fichier
$taille_max = 150000;
    				
//echo "<p>" . $_FILES['mon_fichier2']['size'] ." octets</p>";
    				
    if($_FILES['mon_fichier2']['size'] > $taille_max)
    	{					    
		$erreur =  "<p id='erreur'>------>Le fichier doit faire moins de 150 ko.</p>";
		echo $erreur;
    	include ("include/actus_ajout_form.inc");				
    	}
    			
//	s'il n'y a pas d'erreur (type et taille), fichier renommé et déplacé
    				
if(!isset($erreur))
    				  		
   {
    					
//	récupère l'extension du fichier original et la transforme en minuscule
//echo "<p>".strtolower(substr(strrchr($_FILES['mon_fichier2']['name'], "."), 1)) ."</p>";
$dest_extension = strtolower(substr(strrchr($_FILES['mon_fichier2']['name'], "."), 1));
    						
//	récupère le nom du fichier dans le dossier temporaire et le transforme en minuscule
//echo "<p>" .strtolower(substr(strrchr($_FILES['mon_fichier2']['tmp_name'], "/"), 1)) ."</p>";
$dest_nom = strtolower(substr(strrchr($_FILES['mon_fichier2']['tmp_name'], "/"), 1)) ;
    						
//	contruction du nom complet du fichier qui devra être copié
//echo $dest_nom ."." .$dest_extension ;
$dest_fichier2 = $dest_nom ."." .$dest_extension ;
    					
//	dossier de destination
$dest_dossier2 = 'images_actus/';
    						
//	copie du fichier
   					
    	if(move_uploaded_file($_FILES['mon_fichier2']['tmp_name'], $dest_dossier2 .$dest_fichier2)) 
				{ 
    			//echo("<p>Fichier copi&eacute; ici : <strong>" .$dest_dossier2 .$dest_fichier2 ."</strong></p>"); 
    			chmod($dest_dossier2 .$dest_fichier2, 0777);
				} 
		
		else 
			{ echo("<p>Erreur lors de la copie du fichier t&eacute;l&eacute;charg&eacute;.</p>");}
										

		}	//	FIN traitement et copie du fichier			
    		
} // FIN vérification présence d'un fichier n°2


// ETAPE 4 : CONTROLE DES CHAMPS OBLIGATOIRES + ENREGISTREMENT DES DONNEES
// s'ils sont vides, réaffiche le formulaire

if (empty($new_date) or empty($new_titre) or empty($new_chapeau) or empty($new_contenu) or empty($new_titre_page))

	{
	echo "<p id='erreur'>------> Vous n'avez pas renseign&eacute; tous les champs obligatoires</strong></p>";
	include ("include/actus_ajout_form.inc");
	}

	// LES CHAMPS OBLIGATOIRES SONT REMPLIS, L'ENREGISTREMENT EST CREE
	
	else {
			
		//echo "<p>tous les champs sont bien remplis</p>";

		//	enregistrement de la fiche
			$query = "INSERT INTO tmtd_news (date_publ, titre, chapeau, contenu, lien, image, miniature, code_video, txt_video, meta_title, titre_lien, lien_target)
 VALUES ('$new_date', '$new_titre', '$new_chapeau', '$new_contenu', '$new_lien', '$dest_dossier$dest_fichier',
 '$dest_dossier2$dest_fichier2', '$new_code_video', '$new_texte_video', '$new_titre_page', '$new_titre_lien', '$new_lien_cible')" ;
			$result = mysql_query ($query)
		 		or die('Erreur : '.mysql_error()) ;
		 		
		//	redirection vers la page de gestion des actualités
		 	echo ("<p>Fiche enregistr&eacute;e</p>");
		 	include_once ("include/menu_options_admin.inc") ;
		
	} // FIN CONTROLE + ENREGISTREMENT

par Ryle » 29 mai 2009, 08:16

Lorsque tu fais un
   foreach($_FILES as $val) 
        { 
            echo "$val<br />"; 
        }  
Tu vas stocker tour à tour dans $val chaque élément du tableau $_FILES, ces éléments étant eux mêmes des tableaux, comme tu as pu le constater avec ton print_r().

Il ne te faut donc pas un echo pour voir le contenu de $val, mais un nouveau print_r(). Il te donnera respectivement pour chaque fichier :
Array 
        ( 
            [name] => k723-v1091.jpg 
            [type] => image/jpeg 
            [tmp_name] => /private/var/tmp/php6IBrsN 
            [error] => 0 
            [size] => 78254 
        ) 
et
Array 
        ( 
            [name] => k725-v1093.jpg 
            [type] => image/jpeg 
            [tmp_name] => /private/var/tmp/phpWPPrWH 
            [error] => 0 
            [size] => 66458 
        ) 
Tu peux ainsi uploader chaque fichier comme tu le fais actuellement, en intégrant ton traitement dans la boucle, et en utilisant $val['name'], $val['tmp_name'] ... au lieu de $_FILES['mon_fichier']['name'], $_FILES['mon_fichier']['tmp_name'] ... :)

perdue dans le tableau $_FILES

par Melody Nelson » 29 mai 2009, 07:58

bonjour,

j'essaie de comprendre comment je pourrais réaliser une boucle sur le tableau $_FILES pour pouvoir traiter le téléchargement de 2 fichiers ainsi que l'enregistrement d'infos dans la base de données

jusqu'à présent, je n'avais qu'un fichier à traiter (input file) mais je dois en ajouter un second et stocker les infos dans la base

dans mon formulaire html, j'ai donné des noms différents aux input, ils se nomment "mon_fichier" et "mon_fichier2"

j'obtiens alors le tableau suivant :

Code : Tout sélectionner

Array ( [mon_fichier] => Array ( [name] => k723-v1091.jpg [type] => image/jpeg [tmp_name] => /private/var/tmp/php6IBrsN [error] => 0 [size] => 78254 ) [mon_fichier2] => Array ( [name] => k725-v1093.jpg [type] => image/jpeg [tmp_name] => /private/var/tmp/phpWPPrWH [error] => 0 [size] => 66458 ) )
le script existant que j'essaie de faire évoluer figure à la fin de ce message (il contient un peu-beaucoup de commentaire, désolée...)

je ne comprends pas comment faire à la fois une boucle sur ce tableau tout en testant si l'utilisateur a joint des fichiers afin d'enregistrer les informations adéquates dans la BDD... ou peut-être que je n'ai simplement pas compris la notion de tableau !

si vous pouviez me mettre sur la voie pour que je comprenne mon erreur de logique ou de compréhension, ça m'aiderait beaucoup

merci
// contrôle des champs obligatoires
// s'ils sont vides, réaffiche le formulaire

if (empty($new_date) or empty($new_titre) or empty($new_chapeau) or empty($new_contenu) or empty($new_titre_page))

	{
	echo "<p id='erreur'>------> Vous n'avez pas renseign&eacute; tous les champs obligatoires</strong></p>";
	include ("include/actus_ajout_form.inc");
	}

	// traitement du contenu du formulaire (les champs obligatoires sont remplis)
	else {
			
		//echo "<p>tous les champs sont bien remplis</p>";
	
// 	CONTENU DU TABLEAU $_FILES (utiliser foreach ? comment le combiner avec if ?)

	echo '<pre>';
	print_r ($_FILES);
	echo '</pre>';
	
	foreach($_FILES as $val)
		{
			echo "$val<br />";
		}
	
	echo '<br /> mes valeurs sans parcourir le tableau : <br />';
	echo $_FILES['mon_fichier']['tmp_name'] ;
	echo '<br />';
	echo $_FILES['mon_fichier2']['tmp_name'] ;
	
	
	
		// TRAITEMENT IMAGE PRINCIPALE LIEE A L'ACTU		
		// vérification présence d'un fichier dans le dossier temporaire
		
		if (file_exists($_FILES['mon_fichier']['tmp_name']))
		
			{
			echo "<p>il y a un fichier : " . $_FILES['mon_fichier']['tmp_name'] ."</p>";
			
				//	variable servant à "stocker" les erreurs lors des différents contrôles
					unset($erreur);

				//	vérification du type de fichier			
					$extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'PNG', 'GIF', 'JPG', 'JPEG');
			 
			 		if(!in_array( substr(strrchr($_FILES['mon_fichier']['name'], '.'), 1), $extensions_ok))
						{
					    $erreur = "<p id='erreur'>------>Le fichier doit &ecirc;tre de type png, gif ou jpg.</p>";
					    echo $erreur;
    					include ("include/actus_ajout_form.inc");
    					}
    					
    			//	vérification de la taille du fichier
    				$taille_max = 150000;
    				
    				//echo "<p>" . $_FILES['mon_fichier']['size'] ." octets</p>";
    				
    				if($_FILES['mon_fichier']['size'] > $taille_max)
    					{					    
					    $erreur =  "<p id='erreur'>------>Le fichier doit faire moins de 150 ko.</p>";
					    echo $erreur;
    					include ("include/actus_ajout_form.inc");				
    					}
    			
    			//	s'il n'y a pas d'erreur (type et taille), fichier renommé et déplacé
    				
    				  if(!isset($erreur))
    				  		
    				  		{
    					
    					//	récupère l'extension du fichier original et la transforme en minuscule
    						//echo "<p>".strtolower(substr(strrchr($_FILES['mon_fichier']['name'], "."), 1)) ."</p>";
    						$dest_extension = strtolower(substr(strrchr($_FILES['mon_fichier']['name'], "."), 1));
    						
    					//	récupère le nom du fichier dans le dossier temporaire et le transforme en minuscule
    						//echo "<p>" .strtolower(substr(strrchr($_FILES['mon_fichier']['tmp_name'], "/"), 1)) ."</p>";
    						$dest_nom = strtolower(substr(strrchr($_FILES['mon_fichier']['tmp_name'], "/"), 1)) ;
    						
    					//	contruction du nom complet du fichier qui devra être copié
    						//echo $dest_nom ."." .$dest_extension ;
    						$dest_fichier = $dest_nom ."." .$dest_extension ;
    					
    					//	dossier de destination
    						$dest_dossier = 'images_actus/';
    						
    					//	copie du fichier
   					
    						if(move_uploaded_file($_FILES['mon_fichier']['tmp_name'], $dest_dossier .$dest_fichier)) 
								{ 
    							//echo("<p>Fichier copi&eacute; ici : <strong>" .$dest_dossier .$dest_fichier ."</strong></p>"); 
    							chmod($dest_dossier .$dest_fichier, 0777);
								} 
									else 
										{ 
  										echo("<p>Erreur lors de la copie du fichier t&eacute;l&eacute;charg&eacute;.</p>"); 
										}
										


    								//	enregistrement de la fiche
			$query = "INSERT INTO tmtd_news (date_publ, titre, chapeau, contenu, lien, image, miniature, code_video, txt_video, meta_title, titre_lien, lien_target)
VALUES ('$new_date', '$new_titre', '$new_chapeau', '$new_contenu', '$new_lien', '$dest_dossier$dest_fichier', '$dest_mini_dossier$dest_mini_fichier',
'$new_code_video', '$new_texte_video', '$new_titre_page', '$new_titre_lien', '$new_lien_cible')" ;
			$result = mysql_query ($query)
		 		or die('Erreur : '.mysql_error()) ;
		 		
		 							//	redirection vers la page de gestion des actualités
		 								echo ("<p>Fiche enregistr&eacute;e</p>");
		 								include_once ("include/menu_options_admin.inc") ;
		 								//header('Location: actus_gestion.php') ; 


    						
    						}	//	FIN copie du fichier			
    		
    		
			} // FIN vérification présence d'un fichier
			
				else
				{
				//echo "<p>il n'y pas de fichier</p>";
				
				//	enregistrement de la fiche
			$query = "INSERT INTO tmtd_news (date_publ, titre, chapeau, contenu, lien, code_video, txt_video, meta_title, titre_lien, lien_target)
VALUES ('$new_date', '$new_titre', '$new_chapeau', '$new_contenu', '$new_lien', '$new_code_video',
'$new_texte_video', '$new_titre_page', '$new_titre_lien', '$new_lien_cible')" ;
			$result = mysql_query ($query)
		 		or die('Erreur : '.mysql_error()) ;
		 		
		 		//	redirection vers la page de gestion des acualités
		 		echo ("<p>Fiche enregistr&eacute;e</p>");
		 		include_once ("include/menu_options_admin.inc") ;
		 		//header('Location: actus_gestion.php') ; 
				
				}
				

		
		 } // FIN traitement du contenu du formulaire