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

Eléphant du PHP | 418 Messages

10 sept. 2011, 09:00

Salutation à tous

J'aimerais faire un menu déroulant automatisé, afin d'affiché les lien du menu et des sous menu correspondants

J'ai pour cela créer 2 table

Une Menu, et l'autre SousMenu

Le hic c'est que a chaque fois que je tente l'affichage des sousmenu il me double les valeur de la table Menu

A force de recommencer, j'ai perdu le meilleur script que j'ai fait, mais j'ai une trace de l'idée que je voyais pour ça

voici le code (c'est pas optimisé, ça sert juste pour vérifier le double affichage

Code : Tout sélectionner

$sql = mysql_query("SELECT * FROM Menu,SousMenu"); while ($result = mysql_fetch_array ( $sql)) { /* ----------- */ if (isset($result['SousMenu'])) { $menu = $result['SousMenu']; } if (isset($result['Menu'])) { $menu = $result['Menu']; } echo $result['Menu'].$result['SousMenu'];;
Voici les requêtes sql pour créer les table

Code : Tout sélectionner

// Creation de la table Menu $Query2 = "CREATE TABLE Menu (Id int(13) unique auto_increment, Menu mediumtext, MenuUrl longtext, PRIMARY KEY (Id))"; $mysql_result2 = mysql_query($Query2,$mysql_link); // Creation de la table SousMenu $Query2 = "CREATE TABLE SousMenu (Id int(13) unique auto_increment, SousMenu mediumtext, SousMenuUrl longtext, MenuMenu mediumtext, PRIMARY KEY (Id))"; $mysql_result2 = mysql_query($Query2,$mysql_link);
Pourriez vous m'aider SVP.

Je suis à votre disposition si besion de plus amples questions, sachant que j'ai dans les grandes lignes essayer de résumer la situation

Au fait , c'est un menu vertical avec sous menu, utilisant Javascript, que je compte faire, pas un menu déroulant du type SELECT, OPTION

Merci de votre aide

Cordialement
Modifié en dernier par Fre3z69 le 24 sept. 2011, 14:45, modifié 1 fois.

Mammouth du PHP | 2278 Messages

10 sept. 2011, 09:17

Je ne comprends strictement rien, et en particulier pas le besoin de strocker un menu dans une BDD pour l'exploiter par du javascript qui ne saura pas lire la bdd et auquel il faudra faire appel par du php qui lui passera le éléments en paramètres...
Au moins on fait dans le simp
le...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 418 Messages

10 sept. 2011, 09:22

si j'ai besoin de mettre le menu dans la bdd, car j'ai créer un script qui permet de créer soit même le menu qui seras afficher dans la page d'accueil du site, et ce dernier permettra d'accéder à des pages créer de le même manière, et liées âr les menu et sous menu.

De toute manière peux importe, j'ai besoin d’afficher les éléments "Menu" de la table "Menu", et si il y a un "MenuMenu" dans la table "SousMenu", d'afficher les élément "SousMenu" en dessous des élément "Menu" correspondants.
... javascript qui ne saura pas lire la bdd et auquel il faudra faire appel par du php qui lui passera le éléments en paramètres...
Au moins on fait dans le simp
le...
Ne suis je pas dans la section PHP?? Il me semble que le script donné plus haut est du php, non?
Merci

Merci de votre aide

Cordialement

Mammouth du PHP | 19672 Messages

10 sept. 2011, 10:15

Si on regarde la structure de tes deux tables, le problème le plus évident est l'absence de lien entre les deux tables : comment établis-tu la relation entre un sous-menu et le menu parent ?

À mon avis si tu réponds à ça, tu auras résolu une grande partie de ton problème.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

10 sept. 2011, 10:21

oui, je l'ai dit plus haut

c'est Menu et MenuMenu qui joigne ça

En fait quand je crée un sous menu, j'affiche les Menu existants, ce qui me permet de faire le lien.

Le problème est que j'ai des doublons lorsque je j'affiche les menu et sousmenu.

Merci de votre aide

Mammouth du PHP | 19672 Messages

10 sept. 2011, 10:39

Au lieu d'un lien sur une colonne texte, il serait préférable d'introduire la notion de clé étrangère basée sur la clé primaire de la table liée.

Ensuite au lieu de faire une requête comme tu le fais, tu pourrais faire une jointure. Avec ta requête actuelle, ce que tu obtiens s'appelle un produit cartésien, c'est à dire que pour chaque ligne d'une table, tu obtiens toutes les lignes de l'autre table, ce sont là tes doublons.

Dans la FAQ, j'ai mis il y a pas mal de temps un tuto sur la manière de faire des jointures, tu devrais t'en inspirer pour revoir ta structure de tables.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

10 sept. 2011, 23:15

J'ai essayer cela, mais avec la condition WHERE, ça n'affiche que les Menu qui sont liés avec un SousMenu.

Ce qui fait que on vois pas les autres menu.

A moins de faire un entrée automatique dans la BDD au moment de la création des menu, je ne vois pas comment faire

(J’espère que j'ai su expliquer et que c'est compréhensible, à cette heure ci j'ai du mal ^^)

Merci

Cordialement

Mammouth du PHP | 19672 Messages

10 sept. 2011, 23:25

Peut-être bien que tu fais une mauvaise jointure, fais donc voir ce que tu as fait, je suis presque certain que tu n'as pas les menus qui n'ont pas de sous-menus tout simplement parce qu'il faudrait faire une jointure dite « externe ». À partir de la requête que tu as faite, il sera plus simple de t'expliquer.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

11 sept. 2011, 03:46

j'ai fait ceci

Code : Tout sélectionner

$sql = mysql_query("SELECT * FROM `Menu` AS p, `SousMenu` AS t WHERE p.Menu = t.MenuMenu;"); while ($result = mysql_fetch_array ( $sql)) { /* ----------- */ echo $result['Menu'].$result['SousMenu']; }

Eléphant du PHP | 418 Messages

11 sept. 2011, 07:41

J'ai rejouter un Groupe by, j'affiche bien tous les menu, mais il y'a toujours un problème avec les sousmenu

Code : Tout sélectionner

$sql = mysql_query("SELECT * FROM `Menu` AS p, `SousMenu` AS t GROUP BY p.Menu ORDER BY p.id"); while ($result = mysql_fetch_array ( $sql)) { /* ----------- */ echo $result['Menu'].$result['SousMenu']; }

Mammouth du PHP | 19672 Messages

11 sept. 2011, 09:34

Ok, tu vas donc apprendre à faire une jointure normalisée et surtout une jointure externe qui va te permettre d'extraire les résultats d'une première table avec une jointure sur une seconde table même si il n'existe pas de correspondance dans la seconde.

Ta requête de base d'abord :
SELECT * 
FROM
  `Menu` AS p,
  `SousMenu` AS t 
WHERE p.Menu = t.MenuMenu
Avec une jointure normalisée, voici ce que ça devient :
SELECT * 
FROM `Menu` AS p
 JOIN `SousMenu` AS t ON p.Menu = t.MenuMenu
Jusque là, ce n'est pas vraiment sorcier, sauf qu'on a toujours pas les menu qui n'ont aucun sous-menu. On va donc faire une jointure externe :
SELECT * 
FROM `Menu` AS p
  LEFT OUTER JOIN `SousMenu` AS t ON p.Menu = t.MenuMenu
Tout ce qu'on a ajouté se limite à « LEFT OUTER » : essaye avec ça et observe le résultat, et au passage laisse tomber le GROUP BY qui n'a pas de raison d'être pour cette fois-ci, par contre tu peux probablement ajouter avantageusement 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

11 sept. 2011, 09:47

Voici comment j'ai agencer la dernière requette
	$sql = mysql_query("SELECT * FROM 'Menu' AS p LEFT OUTER JOIN 'SousMenu' AS t ON p.Menu = t.MenuMenu");
	while ($result = mysql_fetch_array ( $sql))
	{
/* ----------- */
	echo $result['Menu'];
	}
Au finale j'ai un code d'erreur:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\automatique\menu.php on line 201

Mammouth du PHP | 19672 Messages

11 sept. 2011, 10:02

Et si tu testais ta requête avec phpMyAdmin ou dans un client MySQL en ligne de commande avant de la tester directement en PHP ?

Règle numéro 1 en la matière : toujours mettre au point tes requêtes directement en SQL avant leur implémentation dans ton code, tu économiseras pas mal de temps et tu auras le cas échéant les messages d'erreur explicite du SGBD.

Et là, tu as recopié en introduisant une erreur : observes bien comment tu as écrit le nom des tables et comment elles étaient écrites dans la requête suggérée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

11 sept. 2011, 10:19

je ne vois pas, les tables sont les bonnes, mis à part que sur le code initial, il y avais des , devant as P

J'essaye de comprendre en même temps le mécanisme de la requête, mais je ne vois pas l'erreur, je manque d'expérience ssur ce genre de requette

Peux tu m'aider à comprendre où est l'erreur stp?

Merci

Cordialement

Mammouth du PHP | 19672 Messages

11 sept. 2011, 10:26

Tu as remplacé des « ` » par des « ' », observe plus attentivement, les deux caractères ne sont pas interprétés de la même manière par MySQL. Ma recommandation en la matière : d'abord ne jamais nommer une table en utilisant un mot réservé, et du coup ne plus utiliser ces caractères autour des noms des tables ou des colonnes dans les requêtes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: