Page 1 sur 6
[Résolut] Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 09:00
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 09:17
par sirakawa
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...
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 09:22
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 10:15
par Cyrano
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.
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 10:21
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 10:39
par Cyrano
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.
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 23:15
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 10 sept. 2011, 23:25
par Cyrano
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.
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 03:46
par Fre3z69
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'];
}
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 07:41
par Fre3z69
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'];
}
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 09:34
par Cyrano
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.
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 09:47
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 10:02
par Cyrano
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.
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 10:19
par Fre3z69
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
Re: Système de menu vertical déroulant automatique
Posté : 11 sept. 2011, 10:26
par Cyrano
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.