Page 1 sur 1

Affichage du résultat d'une requête en liste

Posté : 12 mars 2009, 11:33
par Toons43
Bonjour à tous,

J'ai un problème pour l'affichage du résultat d'une requête PHP
Ma requête fonctionne c'est juste sur l'affichage que je bloque

Voici ce que j'aimerai :

Code : Tout sélectionner

<li><a href="#">Catégorie n°1</a> <ul> <li><a href="#">Item 1</a></li> <li><a href="#">Item 2</a></li> <li><a href="#">Item 3</a></li> </ul> </li> <li><a href="#">Catégorie n°2</a> <ul> <li><a href="#">Item 1</a></li> <li><a href="#">Item 2</a></li> </ul> </li> etc...
Voici le code que j'utilise pour essayer d'obtenir cette affichage

Code : Tout sélectionner

<?php mysql_connect("SERVEUR", "HOSTNAME", "MDP"); // Connexion à MySQL mysql_select_db("BASE"); // Sélection de la base $retour = mysql_query("SELECT * FROM item ORDER BY Cat_name") or die(mysql_error()); $last_cat = ''; while ($donnees = mysql_fetch_assoc($retour)) // On fait une boucle { $current_cat = $donnees['Cat_id']; //On entame une nouvelle categorie if($last_cat != $current_cat) { echo '<li><a href="#">'.$donnees['Cat_name'].'</a>'; echo '<ul>'; } //On affiche les items liés à cette categorie echo '<li><a href="#">'.$donnees['Cat_item'].'</a></li>'."\n"; echo '</ul></li>' $last_cat = $current_cat; } ?>
Le problème c'est que mes listes s'affiche de cette manière

Code : Tout sélectionner

<li><a href="#">Catégorie n°1</a> <ul> <li><a href="#">Item 1</a></li> </ul></li> <li><a href="#">Item 2</a></li> </ul></li> <li><a href="#">Item 3</a></li> </ul></li> <li><a href="#">Catégorie n°2</a> <ul> <li><a href="#">Item 1</a></li> </ul></li> <li><a href="#">Item 2</a></li> </ul></li> etc...
Le problème est donc ce </ul></li> qui se met après chaque item alors qu'il faudrait qu'il arrive après tous les items d'une liste.

Comment construire ma boucle pour arriver au bon résultat ? Je précise que c'est pour un menu en css et que je ne peux pas changer la façon de construire les listes.

J'espère ne pas être trop confus dans mes explications.
D'avance merci pour votre aide

Re: Affichage du résultat d'une requête en liste

Posté : 12 mars 2009, 11:50
par Ryle
Le problème est donc ce </ul></li> qui se met après chaque item alors qu'il faudrait qu'il arrive après tous les items d'une liste.
Tu as déjà fait la moitié du travail en identifiant le problème :)

La solution est donc de mettre ce "</ul></li>" sous une condition, condition correspondant au changement de catégorie. Ton problème c'est que tu ne sais pas à l'avance s'il y aura une nouvelle catégorie dans ta prochaine itération...

L'idée serait donc en début d'itération, déterminer si tu vas changer de catégorie (comme tu le fais actuellement) et, si tu n'es pas sur la première catégorie (donc si ton $last_cat n'est pas vide), commencer par fermer la précédente avant d'ouvrir la nouvelle.

Il ne te restera plus ensuite, une fois sortit de la boucle, à fermer la dernière catégorie ouverte :)

Posté : 12 mars 2009, 12:48
par Toons43
Youpi, ça marche merci beaucoup pour cette réponse. \:D/

J'avais pensé à mettre ce "</ul></li>" sous une condition en début d'itération mais j'avais pas du tout pensé à le comparer à $last_cat pour voir si j'attaque la 1ère catégorie ou pas.

En tout cas merci beaucoup, c'est au top tout fonctionne.

Voici le code au cas où quelqu'un aurait ce même problème un jour

Code : Tout sélectionner

<?php mysql_connect("SERVEUR", "HOSTNAME", "MDP"); // Connexion à MySQL mysql_select_db("BASE"); // Sélection de la base $retour = mysql_query("SELECT * FROM item ORDER BY Cat_name") or die(mysql_error()); $last_cat = ''; while ($donnees = mysql_fetch_assoc($retour)) // On fait une boucle { $current_cat = $donnees['Cat_id']; //Si on est pas sur la première catégorie on ferme la précédente if(($last_cat != '') && ($last_cat != $Categorie_id)) { echo '</ul></li>'; } //On entame une nouvelle categorie if($last_cat != $current_cat) { echo '<li><a href="#">'.$donnees['Cat_name'].'</a>'; echo '<ul>'; } //On affiche les items liés à cette categorie echo '<li><a href="#">'.$donnees['Cat_item'].'</a></li>'; $last_cat = $current_cat; } echo '</ul></li>'; ?>
Juste une dernière question, est-ce que ce code est propre ou on peut faire mieux ? Tant qu'à faire d'apprendre autant le faire comme il faut

Encore merci