Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1401 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [resolu]Boucles sur des requetes MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu]Boucles sur des requetes MySQL

n°1658458
an3k
powered on macintosh ^^
Posté le 14-12-2007 à 16:41:11  profilanswer
 

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
mood
Publicité
Posté le 14-12-2007 à 16:41:11  profilanswer
 

n°1658464
an3k
powered on macintosh ^^
Posté le 14-12-2007 à 17:02:27  profilanswer
 

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 ?

n°1658506
weed
Posté le 14-12-2007 à 18:37:56  profilanswer
 

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
n°1658509
weed
Posté le 14-12-2007 à 18:39:44  profilanswer
 

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

n°1658559
kao98
...
Posté le 14-12-2007 à 20:51:04  profilanswer
 

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
n°1658940
an3k
powered on macintosh ^^
Posté le 16-12-2007 à 14:46:32  profilanswer
 

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 ;)

n°1658941
an3k
powered on macintosh ^^
Posté le 16-12-2007 à 14:47:26  profilanswer
 

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
n°1658972
weed
Posté le 16-12-2007 à 15:54:13  profilanswer
 

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

n°1659193
an3k
powered on macintosh ^^
Posté le 17-12-2007 à 10:19:16  profilanswer
 

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

n°1659204
kao98
...
Posté le 17-12-2007 à 10:38:37  profilanswer
 

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
mood
Publicité
Posté le 17-12-2007 à 10:38:37  profilanswer
 

n°1659244
an3k
powered on macintosh ^^
Posté le 17-12-2007 à 11:08:51  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [resolu]Boucles sur des requetes MySQL

 

Sujets relatifs
Page dynamique ne s'affiche pas php/mysql/easyphp[résolu] Automatiser une fonction excel sur vba
[PHP](AJAX) - Pb Caractères spéciaux (apostrophe) ..euh RESOLU en fait[C++] [resolu] Problème de templates
Exécution commande, pas de retour [Résolu]Résolu [Excel] colori selon critère
[RESOLU] checkBox et databinding[PHP] [ RESOLU ] Textarea et javascript \n ou \\n
[Resolu] Probleme de hauteur de tableau[Résolu] Charger une page "accueil.php" par défaut dans mon index.php
Plus de sujets relatifs à : [resolu]Boucles sur des requetes MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR