[resolu]Boucles sur des requetes MySQL

Boucles sur des requetes MySQL [resolu] - PHP - Programmation

Marsh Posté le 14-12-2007 à 16:41:11    

Bonjour,
 
Je suis assez rouillé en PHP & mySQL (je fais du PHP/XML d'habitude :S), et là j'ai besoin de faire des boucles imbriquées :
j'ai une table catégories, et une table articles, et j'aimerai faire une liste des catégories, avec les articles dedans (deux listes imbriquées) et je dois mal m'y prendre, car ma seconde boucle ne marche pas... sauf si je sélectionne tous les articles, et que je me un if dans ma boucle pour n'afficher que ceux qui sont dans la catéorie en cours, mais ca fait un peu brute :p  
 
Pouvez-vous m'aidez à trouver la force ?
 

Code :
  1. mysql_select_db($database, $db);
  2. $query_catArticles = sprintf("SELECT * FROM catArticles" );
  3. $catArticles = mysql_query($query_catArticles, $db) or die(mysql_error());
  4. $query_articles = sprintf("SELECT * FROM articles, catArticles WHERE catArticles.id=articles.categorie" );
  5. $articles = mysql_query($query_articles, $db) or die(mysql_error());
  6. while($data = mysql_fetch_array($catArticles))
  7.     {
  8.     // liste des catégores
  9.     echo $data['titre'];
  10.     while($dataArt = mysql_fetch_array($articles))
  11.     {
  12.             // liste des articles
  13.             echo $dataArt['titre'];
  14.             }
  15.     }


 
merci !


Message édité par an3k le 17-12-2007 à 12:10:45
Reply

Marsh Posté le 14-12-2007 à 16:41:11   

Reply

Marsh Posté le 14-12-2007 à 17:02:27    

Version boeuf ca marche :

Code :
  1. mysql_select_db($database, $db);
  2. $query_catArticles = sprintf("SELECT * FROM catArticles" );
  3. $catArticles = mysql_query($query_catArticles, $db) or die(mysql_error());
  4. while($data = mysql_fetch_array($catArticles))
  5.     {
  6.     // liste des catégores
  7.     echo $data['titre'];
  8.     $idCatVar = $data['id'];
  9.     $query_articles = sprintf("SELECT * FROM articles WHERE articles.categorie=$idCatVar" );
  10.     $articles = mysql_query($query_articles, $db) or die(mysql_error());
  11.     while($dataArt = mysql_fetch_array($articles))
  12.     {
  13.             // liste des articles
  14.             echo $dataArt['titre'];
  15.             }
  16.     }


 
Si vous avez des optimisations ?

Reply

Marsh Posté le 14-12-2007 à 18:37:56    

Si tu veux optimiser : remplacer mysql_fetch_array par mysql_fetch_array  
 
je comprends pas trop l'interet de faire un printf, un simple  
 

Code :
  1. $query_articles = "SELECT titre FROM articles WHERE articles.categorie = '" . $idCatVar ."' ;


 
De plus le *, je ne comprends pas trop l'interet de l'utiliser. Tu exploite uniquement le champs titre apres ....

Message cité 1 fois
Message édité par weed le 14-12-2007 à 18:38:14
Reply

Marsh Posté le 14-12-2007 à 18:39:44    

bien sur ma remarque s'applique à ta premiere requete aussi ...

Reply

Marsh Posté le 14-12-2007 à 20:51:04    

Pourquoi deux requêtes ? Une seule c'est largement suffisant !
 

Code :
  1. SELECT c.id AS catId, c.titre AS catTitre, a.titre AS artTitre
  2. FROM catArticles c LEFT JOIN
  3.     Articles a ON
  4.     c.id = a.categorie
  5. ORDER BY c.titre, a.titre


Message cité 1 fois
Message édité par kao98 le 14-12-2007 à 20:53:18

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 16-12-2007 à 14:46:32    

weed a écrit :

Si tu veux optimiser : remplacer mysql_fetch_array par mysql_fetch_array  
 
je comprends pas trop l'interet de faire un printf, un simple  
 

Code :
  1. $query_articles = "SELECT titre FROM articles WHERE articles.categorie = '" . $idCatVar ."' ;


 
De plus le *, je ne comprends pas trop l'interet de l'utiliser. Tu exploite uniquement le champs titre apres ....


 
Le sprintf, c'est parce qu'au départ j'avais mis une chaine de caractères avec une variable %s, et j'ai simplifié mon code au fur et à mesure pour que ca  marche, en oubliant de le retirer.
Sinon je ne vais bien-sûr pas utiliser que titre dans ma table ;)

Reply

Marsh Posté le 16-12-2007 à 14:47:26    

kao98 a écrit :

Pourquoi deux requêtes ? Une seule c'est largement suffisant !
 

Code :
  1. SELECT c.id AS catId, c.titre AS catTitre, a.titre AS artTitre
  2. FROM catArticles c LEFT JOIN
  3.     Articles a ON
  4.     c.id = a.categorie
  5. ORDER BY c.titre, a.titre




J'avais aussi essayé le LEFT JOIN sans succès !  
Pas pour la requête, mais pour l'affichage. Je vais retenter !
 
merci :)


Message édité par an3k le 16-12-2007 à 14:49:09
Reply

Marsh Posté le 16-12-2007 à 15:54:13    

an3k a écrit :


 
Le sprintf, c'est parce qu'au départ j'avais mis une chaine de caractères avec une variable %s, et j'ai simplifié mon code au fur et à mesure pour que ca  marche, en oubliant de le retirer.
Sinon je ne vais bien-sûr pas utiliser que titre dans ma table ;)


 
oki, je comprends pour le sprintf.
Sinon pour le coup de l'étoile, meme si tu utilies tous les champs de ta table, il est toujours préférable de spécifier explicitement les noms des champs à ce qui parait ....

Reply

Marsh Posté le 17-12-2007 à 10:19:16    

weed a écrit :


 
oki, je comprends pour le sprintf.
Sinon pour le coup de l'étoile, meme si tu utilies tous les champs de ta table, il est toujours préférable de spécifier explicitement les noms des champs à ce qui parait ....


Quand j'aurais mes pages complètes (et que donc je saurais tout ce que je dois afficher), je ferrai un passage :)
 
J'ai une question concernant le LEFT JOIN. Car lorsque je fais ma boucle, j'ai bien la liste de mes articles, mais je n'ai pas la liste de mes catégories. Je n'arrive pas à récupérer uniquement la liste de mes catégories, pour y inclure ensuite une boucle article ?
 
Dans la doc Google il y a pleins de chose sur la requête en elle même, mais quant à l'utilisation avec PHP... (il y a aussi, mais j'arrive pas à trouver ce point là !)
 
Merci

Reply

Marsh Posté le 17-12-2007 à 10:38:37    

Il faut t'y prendre autrement !
 
Tu obtiens, normalement, une liste qui devrait ressembler à ça :

Code :
  1. c.id | a.id
  2. -----------
  3.    1      1
  4.    1      2
  5.    1      3
  6.    2   NULL
  7.    3      1
  8.    3      2
  9. -----------


 
Quand tu boucles tes enregistrements, tu testes si ta catégorie est différente de la précédente, alors c'est une nouvelle catégorie ! Ca donnerait quelque chose comme ça :
 

Code :
  1. catPrec = 0;
  2. TantQue lireEnregistrement(catId, articleId);
  3.     SI catId != catPrec ALORS
  4.         //Nouvelle catégorie
  5.         AfficherCategorie(catId);
  6.     FINSI
  7.     catPrec = catId;
  8.     AfficherArticle(articleId);
  9. finTantQue


Ce genre de code t'affichera quelque chose comme :
 
Catégorie 1
    Article 1
    Article 2
    Article 3
 
Catégorie 2
 
Catégorie 3
    Article 1
    Article 2
 
C'est à peu près ce que tu veux non  ?


Message édité par kao98 le 17-12-2007 à 10:40:45

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 17-12-2007 à 10:38:37   

Reply

Marsh Posté le 17-12-2007 à 11:08:51    

C'est exactement ça merci :)
 
Voici la traduction :

Code :
  1. $catPrec = 0;
  2. // on ouvre la liste conteneur
  3. echo "<ul>\n";
  4. while ($data = mysql_fetch_array($liste)) {
  5.   // Si on entre dans une nouvelle catégorie
  6.   if ($data['idCat'] != $catPrec) {
  7.     // Si cette catégorie n'est pas la première, on ferme les listes
  8.     if ($catPrec != 0) {
  9.       echo "  </ul>\n";
  10.       echo " </li>\n";
  11.     }
  12.     //Nouvelle catégorie
  13.     echo " <li>Categorie : ";
  14.     echo $data['idCat']."\n";
  15.     echo "  <ul>\n";
  16.     $catPrec = $data['idCat'];
  17.   }
  18.   // On affiche la ligne articles :
  19.   echo "   <li>Article : ";
  20.   echo $row['id'];
  21.   echo "</li>\n";
  22. }
  23. echo "  </ul>\n";
  24. echo " </li>\n";
  25. // C'est fini, on ferme la liste conteneur
  26. echo "</ul>\n";


 
et voilà une liste bien indentée comme celle-ci :

Code :
  1. <ul>
  2. <li> Categorie : 1
  3.  <ul>
  4.   <li> Article : 1</li>
  5.   <li> Article : 4</li>
  6.  </ul>
  7. </li>
  8. <li> Categorie : 2
  9.  <ul>
  10.   <li> Article : 2</li>
  11.   <li> Article : 5</li>
  12.  </ul>
  13. </li>
  14. <li> Categorie : 3
  15.  <ul>
  16.   <li> Article : 6</li>
  17.  </ul>
  18. </li>
  19. <li> Categorie : 4
  20.  <ul>
  21.   <li> Article : 7</li>
  22.  </ul>
  23. </li>
  24. </ul>


Merci beaucoup de votre aide ! :)
 
j'ai même un kado pour kao :
http://media.telemarket.fr/imgprod/4174EC9ADA2169EAE1000000AC110A15.jpg
 :whistle: [:arn0]  
CroBon


Message édité par an3k le 17-12-2007 à 12:13:47
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed