8795 sujets

Développement web côté serveur, CMS

Bonjour,
Etant mon premier post, je me présente rapidement, je suis un jeune intégrateur qui commence à s'intéresser à la programmation.
Mon problème :
J'ai deux tables
- Projet : (Contient menu principal)
*id_projet (Auto incrémenté de 1 à 6)
*nom_projet (Donc 6 catégories)
- Sous Projet : (Contient les sous catégories)
*id_parent
*nom_sous_projet

J'ai donné un id_parent à mes sous catégories correspondant à l'id_projet de mes catégories.

Ma requête SQL:

$req_nav_projet = mysql_query
		('SELECT P.id_projet, P.nom_projet, S.id_parent, S.nom_sous_projet
		FROM test_sous_projet S 
		JOIN test_pages_projet P
		ON P.id_projet = S.id_parent
		GROUP BY S.id_parent 
		ORDER BY S.id_parent ASC');


Je crée une boucle while pour tout afficher :

while($tableau_nav_projet = mysql_fetch_assoc($req_nav_projet)){
<div class="menu capital " id="menu<?php echo stripcslashes($tableau_nav_projet['id_projet']); ?>" onclick="afficheMenu(this); deco_div(this);">
	<a href="#" onclick="deco_link(this);"><?php echo stripcslashes($tableau_nav_projet['nom_projet']); ?></a>
</div>
<div id="sousmenu<?php echo stripcslashes($tableau_nav_projet['id_projet']); ?>" style="display:none">
	<div class="sousmenu">

	<a href="#"><?php echo($tableau_nav_projet['nom_sous_projet']); ?></a>
	</div>
</div>
<?php } ?>


Mes catégories s'affichent correctement mais il n' y a qu'une sous catégorie (la première) qui s'affiche.
Je bute et vous remercie d'avance pour le temps que vous y consacrerez.
C'est à cause de ton "GROUP BY".
Il serait utile si tu voulais récupérer le nombre de sous-projets par projet, mais en l'occurrence il "fusionne" les sous projets", ce qui n'est pas ce que tu veux à priori. Smiley cligne
En réalité le GROUP BY résolvait un autre soucis car mes catégories étaient doublées (12 liens au lieu des 6). DISTINCT n'a aucun impact. En faisant des recherches j'ai trouvé cette solution. Cependant en ne le mettant pas cela ne change rien : il n'y a toujours que le premier sous menu qui s'affiche...
Modifié par KmKz (01 Jun 2012 - 15:52)
Tout d'abord merci moust, de t'être intéressé à mon problème. Smiley biggrin
On m'a répondu sur un autre forum, je vous inscris sa réponse :

a écrit :
Normal, comme tu groupes par id de catégorie-mère, tu compactes toutes les entrées des sous-catégories en une seule ligne. Comme en plus sur ces champs tu n'as pas de fonction d'aggrégat (COUNT(), SUM(), MAX(), etc...) bah la réponse peut-être n'importe quoi.

Il te faut une requête qui liste les sous-catégorie, et qui trimballe la catégorie parente au passage. Tu trie ensuite par catégorie, puis par sous-catégorie.

SELECT P.id_projet,
   P.nom_projet,
   S.id_sous_projet,
   S.nom_sous_projet
FROM Projet AS P
INNER JOIN Sous_Projet AS S
   ON P.id_projet = S.id_parent
ORDER BY P.id_projet ASC, S.id_sous_projet ASC;



Ensuite, quand tu vas traiter en boucle, il te faudra une variable PHP sous la main. Tu l'initialise avant la boucle avec une valeur à la noix que tu es sûr de ne pas rencontrer dans la réponse de la requête. Par exemple, un ID négatif.
Et dans la boucle, tu vas comparer la valeur de l'ID de catégorie à ce qu'il y a dans la variable. Si les 2 sont différents, c'est que tu démarres une nouvelle catégorie, sinon tu reste dans la catégorie mais ajoute une sous-catégorie.

J'utilise une syntaxe spéciale de chaîne de caractères appelée la syntaxe HEREDOC.
Très utile pour les gros blocs de texte comme... les requêtes SQL...
elle permet de choisir ses propres délimiteur de chaine (j'ai choisit ici EOQ) au lieu des guillemets doubles habituels.
Attention à ne pas indenter le délimiteur de fin, sinon plantage !


<?php
$query = <<<EOQ
SELECT P.id_projet,
   P.nom_projet,
   S.id_sous_projet,
   S.nom_sous_projet
FROM Projet AS P
INNER JOIN Sous_Projet AS S
   ON P.id_projet = S.id_parent
ORDER BY P.id_projet ASC, S.id_sous_projet ASC;
EOQ;

$rep = mysql_query($query, $bdd) or trigger_error(mysql_error($bdd), E_USER_ERROR);

$traceur = -1; // Notre variable PHP
while($stmt = mysql_fetch_assoc($rep)) {
   if($traceur != $stmt['id_projet']) { // Nouvelle catégorie à commencer
      if($traceur != -1) { // Ce n'est pas la première catégorie principale démarrée
         // fermeture de la catégorie principale ouverte précédemment
      }
      $traceur = $stmt['id_projet']; // On met à jour notre variable
      // Et on affiche le début de notre catégorie principale
   }
   // Ici : dans tous les cas, on affiche la sous-catégorie
}
if($traceur != -1) { // On a affiché au moins une catégorie
   // Il nous reste donc une catégorie à refermer, on le fait ici
}
?>