Un petit eclaircissement

Eléphanteau du PHP | 19 Messages

01 févr. 2007, 10:02

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 févr. 2007, 12:44

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 :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 514 Messages

01 févr. 2007, 12:47

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 févr. 2007, 12:54

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...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 19 Messages

01 févr. 2007, 13:18

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 févr. 2007, 13:24

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 ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 514 Messages

01 févr. 2007, 15:06

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 ...