[Résolut] Système de menu vertical déroulant automatique

Eléphant du PHP | 418 Messages

13 sept. 2011, 15:55

il ne se passe rien, la flèche retourne à la ligne, et en gros me demande de faire quelque chose.

Mammouth du PHP | 19672 Messages

13 sept. 2011, 15:58

Et le point-virgule de fin d'instruction ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

13 sept. 2011, 16:04

Oups, je savais pas désolé

Voici donc le message sortant avec la requête
SELECT Menu AS 'menu', MenuUrl AS 'url', SousMenu AS 'smenu', SousMenuUrl AS 'surl' FROM Menu AS p LEFT JOIN SousMenu AS t ON p.Id = t.MenuId GROUP BY MenuMenu;
ERROR 1064 (42000): You have an error in your SQL syntax; check the
corresponds to your MySQL server version for the right syntax to use
t_db(automatique)
SELECT Menu AS 'menu', MenuUrl AS 'url', SousMenu AS 'sme' at line 1
et avec la requete
SELECT `Menu` AS 'menu', MenuUrl AS 'url', `SousMenu` AS 'smenu', `SousMenuUrl` AS 'surl' FROM `Menu` AS p LEFT JOIN `SousMenu` AS t ON p.Id = t.MenuId GROUP BY MenuMenu

Mammouth du PHP | 19672 Messages

13 sept. 2011, 16:29

Hé, il y a un truc que je t'ai mentionné deux fois à propos de ta requête, tu ne l'as pas modifié, je pourrais penser que je m,adresse à un mur, c'est le genre de chose qui me lasse assez vite. Je veux bien continuer à t'aider, mais à condition que tu y mettes un peu du tien et que tu lises complètement ce que je t'écris. Je t'ai fourni pas mal de détails, tous sont importants.

Je t'invite donc à relire mes précédentes réponses pour refaire les choses comme il faut, après on verra. Si tu as toujours une erreur, fais un copier coller de tes lignes de commande à partir du « mysql > SELECT etc ..... jusqu'à la fin du message d'erreur. Mais fais d'abord les correctifs que j'ai déjà signalés avant ça.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

13 sept. 2011, 22:28

je regarde les tutos sur les mysql command

http://www.siteduzero.com/tutoriel-3-97 ... mysql.html

je te tiens informé une fois où j'aurais réussit à sélectionner la base. Le problème viens de là en fait.

Et en tout cas, je tiens à te remercier, je c'est que j'ai pas tout compris directement, le truc c'est que j'avais mal à la tête, et j'ai persister dans le fait de vouloir arriver à faire ce script, de ce fait j'ai pas tout bien vu, et après relecture complète de des postes, je ne peux m'excuser de ce fait.

Désolé, et vraiment merci.

On va s'en sortir ^^

Cordialement

Mammouth du PHP | 19672 Messages

13 sept. 2011, 22:33

Ben je t'avais déjà donné les indication mais il est vrai que le tuto du site du zéro est largement plus complet, profites-en à fond, c'est quelque chose qui te sera très utile à l'avenir. Je n'aime habituellement pas la ligne de commande, sauf en SQL où je m'en sers quotidiennement, et je vais souvent bien plus vite pour débogguer de cette manière qu'avec n'importe quoi d'autre, incluant phpMyAdmin.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

13 sept. 2011, 22:37

voici que j'ai fait
mysql> USE automatique;
Database changed
mysql> SELECT * FROM `Menu` AS p, `SousMenu` AS t WHERE p.Id = t.MenuId;
+----+--------+---------+----+--------+------------+-------------+----------+
| Id | Menu   | MenuUrl | Id | MenuId | SousMenu   | SousMenuUrl | MenuMenu |
+----+--------+---------+----+--------+------------+-------------+----------+
|  1 | Menu 1 | menu1   |  2 |      1 | testmenu 1 | testmenu1   | Menu 1   |
|  1 | Menu 1 | menu1   |  3 |      1 | testmenu 2 | testmenu2   | Menu 1   |
|  2 | Menu 2 | Menu2   |  4 |      2 | testmenu 1 | testmenu1   | Menu 2   |
+----+--------+---------+----+--------+------------+-------------+----------+
3 rows in set (0.00 sec)
mysql> USE automatique;
Database changed
mysql> SELECT * FROM `Menu` AS p JOIN `SousMenu` AS t ON p.Id = t.MenuId;
+----+--------+---------+----+--------+------------+-------------+----------+
| Id | Menu   | MenuUrl | Id | MenuId | SousMenu   | SousMenuUrl | MenuMenu |
+----+--------+---------+----+--------+------------+-------------+----------+
|  1 | Menu 1 | menu1   |  2 |      1 | testmenu 1 | testmenu1   | Menu 1   |
|  1 | Menu 1 | menu1   |  3 |      1 | testmenu 2 | testmenu2   | Menu 1   |
|  2 | Menu 2 | Menu2   |  4 |      2 | testmenu 1 | testmenu1   | Menu 2   |
+----+--------+---------+----+--------+------------+-------------+----------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM `Menu` AS p LEFT OUTER JOIN `SousMenu` AS t ON p.Id = t.Me
uId;
+----+--------+---------+------+--------+------------+-------------+----------+
| Id | Menu   | MenuUrl | Id   | MenuId | SousMenu   | SousMenuUrl | MenuMenu |
+----+--------+---------+------+--------+------------+-------------+----------+
|  1 | Menu 1 | menu1   |    2 |      1 | testmenu 1 | testmenu1   | Menu 1   |
|  1 | Menu 1 | menu1   |    3 |      1 | testmenu 2 | testmenu2   | Menu 1   |
|  2 | Menu 2 | Menu2   |    4 |      2 | testmenu 1 | testmenu1   | Menu 2   |
|  3 | Menu 3 | Menu 3  | NULL |   NULL | NULL       | NULL        | NULL     |
+----+--------+---------+------+--------+------------+-------------+----------+
4 rows in set (0.00 sec)
mysql> SELECT Menu AS 'menu', MenuUrl AS 'url', SousMenu AS 'smenu', SousMenuUrl
 AS 'surl' FROM Menu AS p LEFT JOIN SousMenu AS t ON p.Id = t.MenuId GROUP BY Me
nuMenu;
+--------+--------+------------+-----------+
| menu   | url    | smenu      | surl      |
+--------+--------+------------+-----------+
| Menu 3 | Menu 3 | NULL       | NULL      |
| Menu 1 | menu1  | testmenu 1 | testmenu1 |
| Menu 2 | Menu2  | testmenu 1 | testmenu1 |
+--------+--------+------------+-----------+
3 rows in set (0.01 sec)
Au passage, tu aurais un truc pour copier le code facilement, je galère un peux à chaque fois.

Merci

Mammouth du PHP | 19672 Messages

13 sept. 2011, 22:44

Pour copier depuis la ligne de commande, clic-droit, cliquer une fois sur le début de la zone à copier, maintenir la touche [Maj] appuyé jusqu'à ce que le pointeur de souris soit à la fin de la zone à copier, ensuite à nouveau clic-droit et là, c'est dans le presse-papier, tu n'as plus qu'à coller dans un Notepad++ ou n'importe où ailleurs.

Bien, nous avons donc là six liens : trois liens de menus, trois liens de sous-menus, les deux premiers étant rattachés au premier menu, le troisième sous-menu au second menu et le troisième menu n'a pas de sous-menu. Tu as donc tous les éléments voulus pour construire ton menu HTML dans une boucle. Là, il va te falloir de la logique. Et observe bien ta requête, il y a un élément à rajouter que je t'ai déjà indiqué. Tel quel, le résultat conviendrait et cet ajout ne serait pas indispensable, mais à l'avenir, tu risques fort d'avoir des surprises désagréables avec un menu incohérent.

[Edit] Observe bien tes résultats selon les requêtes et les clauses : dis-moi ce que tu en comprends, ce sera un bon élément à apprendre à maitriser
[/Edit]
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

13 sept. 2011, 23:09

Je constaste que les deux première, il affiches tous les Menus qui sont liées via l'ID aux SousMenu.

La troième, il affiche les Menu avec les SousMenu correspondant, et si il n'y a pas de SousMenu, il indique NULL.

Dans tous les cas, il indique tous les champs, car j'ai fait SELECT * .

La dernière, il m'indique comme la troisième, sauf que ce coups ci, il me donne que les champs souhaités et sous forme d'allias.

Je vois bien les resultats comme ça.


Est ce que c'est ça que tu voulais que je t'indique, d'après ce que j'ai compris?

Merci

Edit:

J'ai tenter avec le ORDER BY p.Id

voici le résultat
mysql> SELECT Menu AS 'menu', MenuUrl AS 'url', SousMenu AS 'smenu', SousMenuUrl
 AS 'surl' FROM Menu AS p LEFT JOIN SousMenu AS t ON p.Id = t.MenuId ORDER BY p.
Id;
+--------+--------+------------+-----------+
| menu   | url    | smenu      | surl      |
+--------+--------+------------+-----------+
| Menu 1 | menu1  | testmenu 1 | testmenu1 |
| Menu 1 | menu1  | testmenu 2 | testmenu2 |
| Menu 2 | Menu2  | testmenu 1 | testmenu1 |
| Menu 3 | Menu 3 | NULL       | NULL      |
+--------+--------+------------+-----------+
4 rows in set (0.01 sec)

Mammouth du PHP | 19672 Messages

13 sept. 2011, 23:19

Mouais, si on veut, regarde bien :

La première retourne trois lignes, exclusivement les lignes où un sous-menu existe, donc deux menus et trois sous-menus;
La seconde fait exactement la même chose mais avec une jointure normalisée (clause JOIN ) au lieu d'une clause WHERE;
La troisième sort tout, je vais y revenir;
La quatrième ne sort qu'une seule ligne par menu quel que soit le nombre de sous-menus : là, c'est le GROUP BY qui fait ça et c'est bien pour ça que je t'ai dit de le virer.

Revenons à la troisième requête où tu as un retour de 4 lignes : tous les menus sont bien là, et tous les sous-menus aussi. Le Menu 3 n'a pas de sous-menu, mais il est bien là et c'est ce qui est important : la différence avec le requête 2, c'est que c'est une jointure dite « externe » (LEFT OUTER JOIN) au lieu d'une jointure « interne » (INNER JOIN ou tout simlement JOIN)

Note que le regroupement avec une clause GROUP BY ne s'utilise en général que lorsqu'on tente de récupérer des données sous forme d'agrégats (MAX, AVG, MIN, etc...) où on fait des calculs sur plusieurs lignes. Or tu n'as aucun calcul ni agrégat, donc aucune espèce de raison d'ajouter un GROUP BY.

Il reste donc une seule bonne requête : la troisième à laquelle il manque... je te laisse finir :-*
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

13 sept. 2011, 23:28

eu.... un ORDER BY ?

Oo

Mammouth du PHP | 19672 Messages

13 sept. 2011, 23:39

Ha ben tout de même :)

Oui, et pourquoi à ton avis : lorsque tu enregistreras de nouvelles pages en sous-menu dans ta base, ce ne sera pas obligatoirement dans le bon ordre et c'est sans aucune importance précisément parce qu'un ORDER BY va te ramener les lignes dans un ordre bien précis quel que soit l'ordre dans lequel elles sont enregistrées en base.

Question subsidiaire: sur quelle(s) colonne(s) dois-tu mettre un ORDER BY ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 00:37

je le mettrais sur l'Id de Menu ??

Et ce afin que les Menu soient en ordres.

Mammouth du PHP | 19672 Messages

14 sept. 2011, 06:44

Précisément oui, enfin pour ce qui est des menus, et il faudrait ajouter l'id des sous-menus également : ce qui fait que le tri sera fait sur les menus d'abord, et s'il y a plusieurs lignes d'un même identifiant de menu, le tri secondaire devra être fait sur l'id des sous-menus.

Maintenant, il te reste à mettre tout ça en pratique et à mettre des vraies données dans ta table et à construire un vrai menu de navigation.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 07:16

Je viens de tester le script avec comme Ordre Id de Menu et Id de SousMenu

Voici le résultat:
mysql> SELECT * FROM `Menu` AS p LEFT OUTER JOIN `SousMenu` AS t ON p.Id = t.Men
uId ORDER BY p.Id, t.Id DESC;
+----+--------+---------+------+--------+------------+-------------+----------+
| Id | Menu   | MenuUrl | Id   | MenuId | SousMenu   | SousMenuUrl | MenuMenu |
+----+--------+---------+------+--------+------------+-------------+----------+
|  1 | Menu 1 | menu1   |    3 |      1 | testmenu 2 | testmenu2   | Menu 1   |
|  1 | Menu 1 | menu1   |    2 |      1 | testmenu 1 | testmenu1   | Menu 1   |
|  2 | Menu 2 | Menu2   |    4 |      2 | testmenu 1 | testmenu1   | Menu 2   |
|  3 | Menu 3 | Menu 3  | NULL |   NULL | NULL       | NULL        | NULL     |
+----+--------+---------+------+--------+------------+-------------+----------+
4 rows in set (0.01 sec)
J'ai peur que l'on est encore des doublons, il y a deux fois Menu1, sinon peux être c'est normale, même surement, mais comment faire dans ce cas pour les enlever?

Je vais tester cette requête avec php voir ce que ça donne, je te tien informé.

Merci