Bon, finalement, j'ai finis par trouvé The very best of solution ^^:
En tout cas merci pour le casse-tête, ça fait passé le temps ^^.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 <?php // on se connecte à MySQL $db = mysql_connect('localhost', 'root', '') or die("can' cvonnect"); // on sélectionne la base mysql_select_db('test',$db); $req = mysql_query("select * from (select position, url, nom, 0 as isChild from menu UNION select CONCAT((select position from menu where menu.id=smenu.idMenu), position) as position,url,nom, 1 as isChild from smenu) mymenu order by position") or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $inChild = false; echo '<ul>'; while ($res = mysql_fetch_assoc($req)) { if ($res["isChild"] == 1 && $inChild == false) { echo '<ul>'; $inChild = true; } else if ($res["isChild"] == 0 && $inChild == true) { echo '</ul>'; $inChild = false; } echo '<li><a href="'.$res["url"].'">'.$res["nom"].'</a></li>'; } echo '</ul>'; // on ferme la connexion à mysql mysql_close(); ?>
Dit moi si ça fonctionne chez toi .
Pas de solution, pas de probleme
Une réponse utile (ou +1) ->
Une réponse inutile ou pas d'accord -> et expliquer pourquoi
Une réponse à votre question
+1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Si tu fonctionne comme ça, c'est normal de ne plus avoir les menu de base, ils n'ont pas de sous-menu, du coup tu les exclu .....
bien vu.
voilà encore une autre solution :
tu peux visualiser le rendu du menu sur jsffidle:menu
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 <?php $sql=" SELECT me.id AS meid, me.nom AS menom, me.url AS meurl, me.icon AS meicon, me.position AS meposition, sme.id AS smeid, sme.nom AS smenom, sme.url AS smeurl, sme.icon AS smeicon, sme.position AS smeposition FROM menu AS me LEFT JOIN sousmenu AS sme ON me.id = sme.idmenu ORDER BY me.position, sme.position "; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $menu=array(); $icone=array(); while ($row=mysql_fetch_array($req) ) { if(!isset($menu[$row['menom']])) $menu[$row['menom']] = array() ; $icone[$row['menom']]= array('meurl'=>$row['meurl'],'icone'=>$row['meicon'],'smeurl'=>$row['smeurl']); $menu[$row['menom']][] = $row; } echo '<ul class="menu">'; foreach ($menu as $key => $value) { if(empty($icone[$key]['smeurl'])){ //pas de sous menu echo "<li><a href='".$icone[$key]['meurl']."'> $key </a></li>"; }else{ //création du sous menu echo "<li><a href='".$icone[$key]['meurl']."'> $key </a><ul>"; foreach ($value as $k => $sm) { echo '<li><a href="'.$sm['smeurl'].'">'.$sm['smenom'].'</a></li>'; } echo "</ul></li>"; }//if } echo '</ul>'; ?>
------------
Après le menu ne change pas souvent, pour l'optimiser tu peux mettre en cache(memcache par exemple) les arrays contenant les menus pour éviter des appels sql inutiles.
je ne sais pas comment tu testes mon script et pourtant ça marche chez moi.
Assures toi d'avoir les fonctions de connexion au serveur et à la bd.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 <?php mysql_connect("localhost", "mysql_user", "password") or die("Impossible de se connecter : " . mysql_error()); mysql_select_db("la_bd"); $sql=" SELECT me.id AS meid, me.nom AS menom, me.url AS meurl, me.icon AS meicon, me.position AS meposition, sme.id AS smeid, sme.nom AS smenom, sme.url AS smeurl, sme.icon AS smeicon, sme.position AS smeposition FROM menu AS me LEFT JOIN sousmenu AS sme ON me.id = sme.idmenu ORDER BY me.position, sme.position "; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $menu=array(); $icone=array(); while ($row=mysql_fetch_array($req) ) { if(!isset($menu[$row['menom']])) $menu[$row['menom']] = array() ; $icone[$row['menom']]= array('meurl'=>$row['meurl'],'icone'=>$row['meicon'],'smeurl'=>$row['smeurl']); $menu[$row['menom']][] = $row; } echo '<ul class="menu">'; foreach ($menu as $key => $value) { if(empty($icone[$key]['smeurl'])){ //pas de sous menu echo "<li><a href='".$icone[$key]['meurl']."'> $key </a></li>"; }else{ //création du sous menu echo "<li><a href='".$icone[$key]['meurl']."'> $key </a><ul>"; foreach ($value as $k => $sm) { echo '<li><a href="'.$sm['smeurl'].'">'.$sm['smenom'].'</a></li>'; } echo "</ul></li>"; }//if } echo '</ul>'; ?>
le rendu chez moi donne ceci:menu.
oui la je comprends pas,
je suis bien connecter en bdd, j'ai pas d'erreur SQL, j'ai aucune erreur d'ailleurs mais rien ne s'affiche ....
EDIT : je pense avoir trouvé c'est un souci de <ul> ouver /fermé
Ok c'est bon
ça marche avec la dernière solution armel18.
en tout cas merci a vous trois (skeud, armel18 et rawsrc) pour le coup de main, c'est fait toujours du bien une bonne petite prise de tête en php
Cdt
@+
Hehe concernant la requete de fou comme tu dis ^^:
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part select * from (select position, url, nom, 0 as isChild from menu UNION select CONCAT((select position from menu where menu.id=smenu.idMenu), position) as position,url,nom, 1 as isChild from smenu) mymenu order by position
On va la découper pour que tu comprennes:
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part select position, url, nom, 0 as isChild from menu
ça c'est pour récupéré tout les menu
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part select CONCAT((select position from menu where menu.id=smenu.idMenu), position) as position,url,nom, 1 as isChild from smenu
La je récupère les sous-menu de manière à avoir le premier champ, une concaténation de la position du sous-menu et du menu correspondant
Me permet de récupéré la position du menu associé au sous-menu
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part select position from menu where menu.id=smenu.idMenu
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part CONCAT((select position from menu where menu.id=smenu.idMenu), position)
Permet de concaténé les deux position, ainsi si un menu est en 2 et le sous-menu en 1, la position résultante sera 21, ça permet d'effectué un tri après .
Avec ces deux requete, je créer la table temporaire qui me servira à trier les données:
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part (select position, url, nom, 0 as isChild from menu UNION select CONCAT((select position from menu where menu.id=smenu.idMenu), position) as position,url,nom, 1 as isChild from smenu) mymenu
La table mymenu contient donc tout les menu et sous-menu avec comme premier champ les valeur du style:
Ensuite je sélectionne dans cette table tout, et effectue un tri sur la position pour les avoir dans l'ordre.1 2 21 22 3 31 32 ....
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part select * from (....) mymenu order by position
Voila, comme ça tu obtiens tout les menu et les sous menu .
PS: UNION permet de joindre le résultat de deux requête dans une seule sortie, à la condition que tes deux requête retourne le même nombre de champ.
Pas de solution, pas de probleme
Une réponse utile (ou +1) ->
Une réponse inutile ou pas d'accord -> et expliquer pourquoi
Une réponse à votre question
ok,
merci pour l'explication ça me parait hyper claire c'est très sympa.
je savais pas que l'on pouvait créer une table temporaire c'est énorme ça.
Merci encore pour ton aide et à charge de revanche, même si je doute que je puisse d'aider en dev
par contre si tu as des besoins en Webdesign c'est plus ma partie.
je te place en ami si ça te dérange pas .
Merci encore.
@+
Bah écoute si en webdesign et création de site web ça t'interesse, j'ai un petit (tout est relatif) projet qui aurait besoin d'un webmaster ^^.
On peut en discuter par mp .
Pas de solution, pas de probleme
Une réponse utile (ou +1) ->
Une réponse inutile ou pas d'accord -> et expliquer pourquoi
Une réponse à votre question
bah pourquoi pas,
j'ai pas mal de boulot en cette rentrée mais explique moi cela par MP.
on verra
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager