for () + sql

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 15:39

J'ai une table avec 4 lignes, voici sa structure :

Champ Type Attributs Null Défaut Extra Action
id_media_pic int(11) Non auto_increment
id_media_article int(11) Non 0
pic text Non
date date Non 0000-00-00
alt text Non

le champ id_media_article est le meme pour toutes les lignes.

j'aimerais faire une requete qui selectionne les 4 champs 'id_media_pic', et les mets par exemple dans un tableau,de façon a ensuite faire des modifications sur chacune des lignes, indépendament, à l'aide d'une boucle mais je n'y arrive pas.
<?php
for ($i=1;$i<=4;$i++) 
		{
			if (isset($_FILES['pic'.$i]['name']) && $_FILES['pic'.$i]['name']!='') 
			{
				$pic = $_FILES['pic'.$i]['name'];
				no_accent($pic);
				$alt = addslashes($_POST['alt'.$i]);

				$sql_id = "SELECT * FROM media_pics WHERE id_media_article='$id_media_article'";
				$query_id = mysql_query($sql_id);
				$result_id[$i] = mysql_fetch_array($query_id);
				$id_media_pic = $result_id[$i]['id_media_pic'];
				
				echo "result_id[$i]['id_media_pic'] : ".$result_id[$i]['id_media_pic']."<br>";
				echo "id_media_pic : ".$id_media_pic."<br>";
								
				$sql_pics = "UPDATE media_pics SET date='$date',alt='$alt' WHERE id_media_pic='$id_media_pic'";
				$query_pics = mysql_query($sql_pics) OR die("Erreur : ".mysql_error());

				
		
				$dir="pictures/";

				$dest=$dir."media_".$id_media_pic."_".$pic;
				move_uploaded_file($_FILES['pic'.$i]['tmp_name'], $dest);
				$sql_upd = "UPDATE media_pics SET pic='".$id_media_pic."_".$pic."' WHERE id_media_pic='$id_media_pic'";
				$query_upd = mysql_query($sql_upd) OR die("Erreur : ".mysql_error());
			}?>
le probleme actuel est que $result[$i]['id_media_pic'] me recupere en boucle l'id_media_pic de la premiere ligne seulement.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 15:44

à quoi correspond $i ?
et que vaut $id_media_article ? cette variable ne récupère nulle part de valeur

si je comprends bien tu veux récupérer chaque ligne de ta table pour les modifier une par une ?
si c'est effectue ta requête puis boucle sur les résultats plutôt

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:01

$i est la variable que j'utilise dans mon for() en premiere ligne. $id_media_article est une variable que je recupere plus haut, lorsque je selectionne l'article sur lequel je veux modifier les images. les deux fonctionnent bien

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 16:04

oui mais je voulais dire : qu'est-ce que $i représente dans ton code ?

car je ne comprend pas : comment sais-tu que tu as 4 lignes ?

en fait à mon avis le for() ne sert à rien , tu pourrais sélectionner tes lignes et boucler dessus plus simplement

à quoi correspond cette table en fait et qu'est-ce que tu souhaites faire comme maipulation ? je veux dire en français dans ton contexte, pas en terme de code

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:10

en fait si tu te souviens il y'a quelques jours j'ai fait un post (celui ci) sur un probleme de boucle, qui mettait en scene 4 input FILE (pas un de plus, pas un de moins), remplit ou non lorsque que le formulaire est envoyé. le for() represente ces 4 input FILE. sur chaque input, je test si il est remplit, si oui je fais ma requete qui va me servir a modifier l'image 1, 2, 3 ou 4 liée à l'article.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 16:14

ok je comprend mieux alors

c'est normal, ici :
 $result_id[$i] = mysql_fetch_array($query_id); 
mysql_fetch_array te renvoie un tableau avec les données de la ligne courante
mysql_fetch_array() retourne un tableau qui contient la ligne demandée dans le résultat result et déplace le pointeur de données interne d'un cran.
hors ici tu n'en changes jamais

ce serait plutôt quelque chose comme ça :
while ($result_id = mysql_fetch_array($query_id)) {
   // ici le traitement pour chaque ligne
}
là tu parcoureras toutes tes lignes de résultats ;)

à adapter bien sûr à ce que tu veux faire

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:24

Voila ce que je viens de faire :
<?php
for ($i=1;$i<=4;$i++) 
		{
			if (isset($_FILES['pic'.$i]['name']) && $_FILES['pic'.$i]['name']!='') 
			{
				$pic = $_FILES['pic'.$i]['name'];
				no_accent($pic);
				$alt = addslashes($_POST['alt'.$i]);

				$sql_id = "SELECT * FROM media_pics WHERE id_media_article='$id_media_article'";
				$query_id = mysql_query($sql_id);
				
				while ($result_id = mysql_fetch_array($query_id)) 
				{
					$id_media_pic = $result_id['id_media_pic'];
					
					echo "id_media_pic : ".$id_media_pic."<br>";
					
				
					$sql_pics = "UPDATE media_pics SET date='$date',alt='$alt' WHERE id_media_pic='$id_media_pic'";
					$query_pics = mysql_query($sql_pics) OR die("Erreur : ".mysql_error());

					
		
					$dir="pictures/";

					$dest=$dir."media_".$id_media_pic."_".$pic;
					move_uploaded_file($_FILES['pic'.$i]['tmp_name'], $dest);
					$sql_upd = "UPDATE media_pics SET pic='".$id_media_pic."_".$pic."' WHERE id_media_pic='$id_media_pic'";
					$query_upd = mysql_query($sql_upd) OR die("Erreur : ".mysql_error());
				}
			}?>
2 pb : le echo "id_media_pic : ".$id_media_pic."<br>"; me renvoie cela :

id_media_pic : 12
id_media_pic : 13
id_media_pic : 12
id_media_pic : 13

j'imagine que c'est normal vu qu'il il y'a deux boucles.. ? (dans cette exemple, j'ai uploadé 2 images)

le deuxieme pb est que dans la bdd, il modifie bien les deux lignes, mais inscrit le nom de l'image fournit dans l'input FILE n°2 dans les 2 lignes : /

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 16:29

ben oui les infos n°2 écrasent celles du n°1

je repose la question, peut-être que cette fonction tu répondras :
à quoi correspondent ces manipulations ? que sont ces images et cette table ?


c'est vraiment bizarre comme fonctionnement :

récupérer 4 images
récupérer 4 ligne
puis boucler sur les images, et pour chaque récupérer toutes les données pour ne modifier qu'une ligne

hum hum

tu n'as pas moyen d'identifier plus précisément la ligne que tu souhaites modifier ? cela t'éviterait ce SELECT et cette boucle

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:35

le but de tout ça, c'est de modifier le nom des images liées à l'article dans ma table media_pics. tout d'abord il crée un article, et lui assigne des images, mais je voudrais egalement qu'il puisse modifier ces images.

donc je verifie quels sont les input FILE qui sont rempli :

if (isset($_FILES['pic'.$i]['name']) && $_FILES['pic'.$i]['name']!='')
{}

et a chaque fois que je trouve un input rempli, je fais mes manipulations de selection de la ligne correspondante à cette image, et je modifie le nom de l'image dans la bdd (et ensuite tout le bordel d'upload de l'image et de resize, mais là n'est pas le pb ).

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 16:38

etu tu n'aurais pas moyen, en plus de l'id de l'article, de récupérer pour chaque l'identifiant de la ligne ?

comme ça tu fais ton "UPDATE ... WHERE id_article = $id_article AND id_image = $id_image"

je schématise mais ça t'éviterai ces bidouilleries avec un SELECT et une double boucle

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:49

bin il me semble que c'est ce que j'essayais tant bien que mal de faire avec ceci :
$sql_id = "SELECT * FROM media_pics WHERE id_media_article='$id_media_article'"; 
                $query_id = mysql_query($sql_id); 
                $result_id[$i] = mysql_fetch_array($query_id); 
                $id_media_pic = $result_id[$i]['id_media_pic']; 
que finalement j'ai enlevé pour réaliser une boucle en while :
$sql_id = "SELECT * FROM media_pics WHERE id_media_article='$id_media_article'";
				$query_id = mysql_query($sql_id);
				
				while ($result_id = mysql_fetch_array($query_id)) 
				{}
qui ne marche pas mieux :lol:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 16:54

je voulais dire via ton formulaire : faire directement correspondre
fichier - article - ligne d'image

sans justement faire cette requête de sélection

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 16:59

c'est a dire ? a coté de chaque input FILE, créer un input hidden, et lui affecter l'id_media_pic correspondant ? il faudra tout de meme que je crée une requete SELECT je pense, qui ressemblera en tout point à celle ci. Seule sa place va changer.. j'arive pas bien à visualiser..

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 17:03

je ne sais pas de quelle façon

mais en tout cas faire un SELECT pour faire un UPDATE dessus, 'cest qu'il y a un problème, et tu pourrais t'en passer

donc ça pourrait effectivement être un champ hidden, qui pour chaque photo $i, contiendrait le numéro de la ligne correspondante dans ta table

comme ça tu récupères tes infos (id_article, id_ligne) et tu fais directement un UPDATE données_de_la_photo WHERE id_article = $id_article AND id_ligne = $id_ligne

VaN
Mammouth du PHP | 1107 Messages

21 juil. 2005, 17:06

donc ça pourrait effectivement être un champ hidden, qui pour chaque photo $i, contiendrait le numéro de la ligne correspondante dans ta table
donc il y'a bien un SELECT derriere ça nan ?