Page 1 sur 2
for () + sql
Posté : 21 juil. 2005, 15:39
par VaN
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.
Posté : 21 juil. 2005, 15:44
par ouckileou
à 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
Posté : 21 juil. 2005, 16:01
par VaN
$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
Posté : 21 juil. 2005, 16:04
par ouckileou
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
Posté : 21 juil. 2005, 16:10
par VaN
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.
Posté : 21 juil. 2005, 16:14
par ouckileou
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
Posté : 21 juil. 2005, 16:24
par VaN
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 : /
Posté : 21 juil. 2005, 16:29
par ouckileou
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
Posté : 21 juil. 2005, 16:35
par VaN
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 ).
Posté : 21 juil. 2005, 16:38
par ouckileou
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
Posté : 21 juil. 2005, 16:49
par VaN
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

Posté : 21 juil. 2005, 16:54
par ouckileou
je voulais dire via ton formulaire : faire directement correspondre
fichier - article - ligne d'image
sans justement faire cette requête de sélection
Posté : 21 juil. 2005, 16:59
par VaN
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..
Posté : 21 juil. 2005, 17:03
par ouckileou
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
Posté : 21 juil. 2005, 17:06
par VaN
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 ?