[Résolu]foreach et file_put_contents:1 seule donnée récuprée

Eléphant du PHP | 250 Messages

21 déc. 2011, 13:01

Bonjour
Dans un formulaire multi upload images et textes, je rencontre un (bête?) problème dans la lecture/récupération des données d'un array.
J'obtiens bien le tableau, je crée comme je l'attendais les fichiers .txt propres à chaque image avec le bon nom (même si j'ai l'alerte:Warning: file_put_contents() expects at least 2 parameters, 1 given in.....etc.), mais lors d'un upload multiple, seul le dernier texte est enregistré...dans tous les fichiers .txt créés....
Un print_r du tableau me donne:
  [txt_img] => Array
        (
            [1] => 1
            [2] => 2
        )
et :
			echo '<pre>'; echo $texte_image; echo '</pre>';
m'affiche bien les lignes de textes différentes.
La dernière boucle foreach est la partie concernée dans mon code:
     if(!empty($_FILES['fichier']))
    {

// Script chargement images  
        //$_FILES existe

        $compteur=0;
set_time_limit(300);//modification de la limitation de temps d'exécution du script en seconde
$dos_destinataire = mkdir("../albums/$nom_dossier");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier
$miniatures = mkdir("../albums/$nom_dossier/pictos");
        foreach ($_FILES['fichier']['name'] as $key => $value) 
        {
            $fichier=$value;//nom reel de l'image
            $size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets
            $tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)
            $type=$_FILES['fichier']['type'][$key];//type de l'image

			$txt = "../albums/$nom_dossier/$fichier.txt ";//nom et chemin fichier txt au nom de l'image 
			$execution = file_put_contents($txt);//création fichier txt au nom de l'image 

		foreach ($txt_img  as $cle => $texte_image){
				file_put_contents($txt, 'texte img'.$cle.': '.$texte_image);
			}
Je me doute bien que (une fois encore) le problème est entre la chaise et le clavier :mrgreen: , mais là je ne vois plus..
Auriez vous une idée, une piste, un conseil.

D'avance merci pour votre aide.
Modifié en dernier par Boro64 le 21 déc. 2011, 17:28, modifié 1 fois.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2577 Messages

21 déc. 2011, 14:35

Après un rapide coup d'oeil, j'ai un doute sur :
foreach ($_FILES['fichier']['name'] as $key => $value)
Ne serait ce pas plutot :
foreach ($_FILES as $key => $value)
avec ensuite une traitement de $value['name'] et des autres indices associés.

Eléphant du PHP | 250 Messages

21 déc. 2011, 14:41

Bonjour Mazarini
Heun, non, pas de soucis de traitement des images, mais sans doute aurais je du mettre tout le script... :oops:
Mea Culpa, je répare:
	//appel de la fonction redimensionnement images 
	include ('includes/fctredimimage.php');
	
//Définitions des variables nécessaires
$nom_dossier= "album-".$nouvel_id;
$nom_dossier = str_replace("'", "_", $nom_dossier);
$extension = array('jpg', 'JPG', 'JPEG', 'jpeg');//définition de la variable extension gérant les ext. autorisées

$path = "../albums/".$nom_dossier."/";
$thumb = "../albums/".$nom_dossier."/pictos/";
$nom = stripslashes(trim($_POST['nom']));
$txt_img = stripslashes(trim(nl2br($_POST['txt_img']))) ? $_POST['txt_img'] : 1;

$descriptif =  stripslashes(trim(nl2br($_POST['descriptif'])));
$utf = mysql_query("SET NAMES UTF8");

	//requêtes
	//1ere requete = enregistrement dans la base de l'album
		$sql = "INSERT INTO albums (id_album, nom_album, descriptif, dossier_img, date_crea)
		VALUES
		(' ', 
			' ".mysql_real_escape_string(trim($nom))." ', 
					' ".mysql_real_escape_string(trim($descriptif))."',					
							' ".mysql_real_escape_string(trim($nom_dossier))." ', NOW() ) ";
            mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());


]     if(!empty($_FILES['fichier']))
    {

// Script chargement images  
        //$_FILES existe

        $compteur=0;
set_time_limit(300);//modification de la limitation de temps d'exécution du script en seconde
$dos_destinataire = mkdir("../albums/$nom_dossier");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier
$miniatures = mkdir("../albums/$nom_dossier/pictos");
        foreach ($_FILES['fichier']['name'] as $key => $value) 
        {
            $fichier=$value;//nom reel de l'image
            $size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets
            $tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)
            $type=$_FILES['fichier']['type'][$key];//type de l'image

			$txt = "../albums/$nom_dossier/$fichier.txt ";//nom et chemin fichier txt au nom de l'image 
			$execution = file_put_contents($txt);//création fichier txt au nom de l'image 

			foreach ($txt_img  as $cle => $texte_image){
				file_put_contents($txt, 'texte img'.$cle.': '.$texte_image);
			}

			
                //vérification du type de l'image et son poids
                if ( in_array(substr($fichier, -3), $extension) && $size<=4194304  )
                { 

                    // type mime jpeg, jpg, gif ou png poids < à 4194304 octets soit 4Mo
                    //le nouveau nom de l'image est composé du nouvel id, de -, de la date format unix, d'un point et de l'extension. 
                    $nom_final= $nom_dossier."-".$fichier.".".substr($fichier, -3);
					$nom_final = mb_strtolower($nom_final);//mise en minuscule 
											
                  //on déplace l'image dans le répertoire final
                    if (move_uploaded_file($tmp, $path.$nom_final)) 
                    {
					//redimensionnement de l'image grand format
					$redimOK = fctredimimage(700,700,'','',$path,$nom_final);
					// redimensionnement pour picto
					$picto = fctredimimage(200,180,$thumb,$nom_final, $path, $nom_final);
                 

						


                    }

           
              }

            $tab_final[$compteur] = $nom_final;
            $compteur++;

					
			
        }
    }//fin de l'instruction if  !empty($_FILES['fichier'])
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2577 Messages

21 déc. 2011, 16:41

$execution = file_put_contents($txt); ne sert à rien (sauf si tu veux ecraser le contenu du fichier). Par contre, il faut indiquer dans l'autre un 3ème paramètre FILE_APPEND pour indiquer que tu ne veux pas écraser le contenu du fichier

Eléphant du PHP | 250 Messages

21 déc. 2011, 17:05

Ok, Merci, je comprends mieux :oops:
Reste que dans l'absolu, j'aurais aimé avoir 1 fichier avec le texte de l'image 1, et 1 fichier avec le texte de l'image 2 (et non pas les 2 textes dans chaque fichier), chaque fichier portant (tu as du le voir) le nom de l'image.......
est ce possible (et si oui, comment devrais je m'y prendre, ou plutôt quelle est la piste à suivre pour faire cela)?
D'avance merci.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

ViPHP
ViPHP | 2577 Messages

21 déc. 2011, 17:14

$txt = "../albums/$nom_dossier/$fichier.txt ";
Je n'ai pas cherché ou $fichier et $nom_dossier étaient calculés, mais si tu te bases sur $_FILES['fichier']['name'][$key], ca devrait peut être te convenir.

Au passage, il existe une fonction getimagesize() - pas sur du nom) qui permet de connaitre le type d'image, ca me semble mieux que de tester l'extention .gif ou .jpg.

Eléphant du PHP | 250 Messages

21 déc. 2011, 17:26

Merci beaucoup Mazarini ! =D>
Pour le getimagesize, c'est juste, il renvoi un tableau avec 7 éléments, dont le type MIME; mais il y a aussi image_type_to_mime_type qui le fait directement...je vais donc améliorer tout ça..
Merci à toi, et bonnes fêtes
Tchô
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."