Page 1 sur 1
Un petit eclaircissement
Posté : 01 févr. 2007, 10:02
par The_coach
Je me pose une question concernant les boucles While et DO...While.
Je connais et comprend la différence des 2 boucles par contre pouvez vous me dire pourquoi la première boucle me donne tout les enregistrements de ma requete $RsProduits alors que la seconde me sucre systematiquement le 1er enregistrement ?
//Premiere boucle
Do
{
echo 'mes produits' ;
} while ($row_RsProduits = mysql_fetch_assoc($RsProduits));
//Deuxieme boucle
while ($row_RsProduits = mysql_fetch_assoc($RsProduits))
{
echo 'mes produits' ;
}
Merci de votre aide.
Posté : 01 févr. 2007, 12:44
par Ryle
C'est curieux autant qu'étrange, et elle ne devrait pas...
N'aurais tu as pas un : if ($row_RsProduits = mysql_fetch_assoc($RsProduits)) au préalable pour tester s'il y a des des enregistrement retournés, et qui te fais passer le pointeur sur le second ?
En fait, le do/while va être exécuter au minimum une fois quoi qu'il arrive. Donc pour être sur que cela ne génère pas d'erreur, il te faut avoir testé et lu le premier enregistrement, chose qu'il ne faut pas faire dans un while/do (qui fera lui même le test de présence et de lecture avant d'entrer dans la boucle

)
Posté : 01 févr. 2007, 12:47
par mcorgnet
J'ai déjà eu ce problème avec mysql_fetch_assoc
cela dit, j'avais réussi à corriger.
je préfère mysql_fetch_row.
Posté : 01 févr. 2007, 12:54
par Ryle
Je vois pas trop le rapport entre le fait de sauter le premier enregistrement et avoir un tableau associatif ou indexé m'enfin...
Et pourquoi cette préférence pour le fetch_row ?
Je trouve beaucoup plus explicite d'utiliser : $row['id_produit'] et $row['libelle_produit'] que $row[4] et $row[7] .... et surtout, le jour ou je rajoute un champ en début de table, je n'ai pas besoin de retoucher à mon code alors qu'il te faudra réorganiser tous tes index...
Posté : 01 févr. 2007, 13:18
par The_coach
C'est curieux autant qu'étrange, et elle ne devrait pas...
N'aurais tu as pas un : if ($row_RsProduits = mysql_fetch_assoc($RsProduits)) au préalable pour tester s'il y a des des enregistrement retournés, et qui te fais passer le pointeur sur le second ?
En fait, le do/while va être exécuter au minimum une fois quoi qu'il arrive. Donc pour être sur que cela ne génère pas d'erreur, il te faut avoir testé et lu le premier enregistrement, chose qu'il ne faut pas faire dans un while/do (qui fera lui même le test de présence et de lecture avant d'entrer dans la boucle

)
J'ai utilisé le if ($row_RsProduits = mysql_fetch_assoc($RsProduits)) justement dans le cas de la boucle Do ... While afin de résoudre les pbs d'affichage en cas d'absence d'enregistrement.
Dans le cas de la boucle While ( if ($row_RsProduits = mysql_fetch_assoc($RsProduits)) {...}, je n'ai pas de if ($row_RsProduits = mysql_fetch_assoc($RsProduits))
Bizarre bizarre
Posté : 01 févr. 2007, 13:24
par Ryle
Et t'as pas d'autre mysql_fetch* qui traine ?
Tu nous fais voir le code depuis l'exécution du query jusqu'au while ?
Posté : 01 févr. 2007, 15:06
par mcorgnet
Et pourquoi cette préférence pour le fetch_row ?
entre autres parce qu'il m'arrive souvent de traiter les résultats avec une boucle foreach.
Aussi parce qu'à priori, c'est ce qu'il y a de plus rapide.
Enfin parce que mysql_fetch_assoc m'a déjà fait des misères que je n'avais réussies à corriger qu'avec mysql_fetch_row (exemples, certains de mes champs n'étaient pas renvoyés lors du traitement du résultat de ma requête)
Après, c'est une question de préférences ...