[php][mysql] menu efficient opbouwen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
In mijn site zit een javascript-pulldownmenu'tje die ik vul met content uit een database. Dat werkt ongeveer op deze manier:

Eerst moet je de menu's definiëren
code:
1
2
3
4
SetMenus(
    {MenuID:"item_shop"},
    {MenuID:"item_1"}
)

en vervolgens aangeven wat er aan deze menu's gekoppeld moet werden
code:
1
2
3
4
5
6
7
8
SetItems(
    {MenuID:"item_shop",DisplayText:"Assortiment",LinkURL:"menu.php",ChildID:"item_1"},
    {MenuID:"item_1",DisplayText:"Assortiment",LinkURL:"menu.php?id=1"}
    //MenuID:"naam van de parent",
    //DisplayText:"weergave tekst",
    //LinkURL:"waarnaar toe als je er op klikt", 
    //ChildID:"naam van het huidigeblok" (optioneel) 
)

Als een menu nog een submenu (child) heeft dan moet er een ChildID bij komen waar de bijbehorende subs aangekoppeld zijn. Maar als er geen bijbehorende subs zijn, dan moet deze niet worden gezet. Want als je hem toch zet dan krijg je een zwart streepje en pijltje achter de tekst.
Via php bouw ik de tekst op. En wonderbaarlijk genoeg lukt me dat ook nog wel. Alleen ik weet niet wanneer een item "kinderen" heeft. Dus doe ik in de loop nog een extra query. En die wordt dus tig keer uitgevoerd. 8)7

Het stuk code waar het om gaat:
PHP:
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
    //basis menu aanmaken
    $menu_SetMenus .= '{MenuID:"item_menu"},';
    $menu_SetItems .= '{MenuID:"base",DisplayText:"Assortiment ",LinkURL:"menu.php",ChildID:"item_menu"},';

    if ($menu_result = mysql_query("SELECT *
                   FROM $tablename_categorie AS c
                   ORDER BY categoriecode,parent_id"))
    {
        if (mysql_num_rows($menu_result)) {
            while ($menu_row = mysql_fetch_array($menu_result)) {
                $link = "menu.php?cat=".$menu_row["id"];
                $child = '';
                //nog even tig keer een query uitvoeren om te kijken of hij kinderen heeft >_<
                if($check_row = mysql_fetch_array(mysql_query("
                        SELECT id 
                        FROM $tablename_categorie 
                        WHERE parent_id = ".$menu_row['id']
                        )))
                {
                    //is er een child dan definieren
                    $child = ',ChildID:"item_menu'.$menu_row["id"].'"';
                }
                if($menu_row['parent_id']==0){ //als er geen parentid is dan koppelen aan basismenu
                    $menu_SetMenus .= '{MenuID:"item_menu'.$menu_row["id"].'"},';
                    $menu_SetItems .= '{MenuID:"item_menu",
                            DisplayText:"'.$menu_row["categorie"].'&nbsp;",LinkURL:"'.$link.'"'.$child.'},';
                } else {
                    $menu_SetMenus .= '{MenuID:"item_menu'.$menu_row["id"].'"},';
                    $menu_SetItems .= '{MenuID:"item_menu'.$menu_row["parent_id"].'",
                            DisplayText:"'.$menu_row["categorie"].'",LinkURL:"'.$link.'"'.$child.'},';
                }
            }
        }
    }


Het werkt, maar dat zou toch veel beter moeten kunnen? :/

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Waarom heb je die query in die loop zitten?
Ik zou die gewoon joinen met die andere query, dat scheelt weer x aantal query's ;)

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17-09 20:52

ripexx

bibs

Haal alle items op, zet het in een array en kijk dan of er een element is wat een parent_id heeft. Verder zijn er zat manieren om dat te doen. Als je met grotere trees gaat werken moet je alleen oppassen voor recurise want dat vindt php niet zo leuk. Verder zul je in de search meer relevanten zaken vinden als je gaat zokene naar "nested tree". :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
Dat is idd een beter idee :D

Dan zou het zoiets worden?
code:
1
2
3
4
5
SELECT * 
FROM categorie c1 
LEFT JOIN categorie c2 
   ON (c1.parent_id = c2.id) 
ORDER BY c1.categoriecode,c1.parent_id

de row die een lege c2 teruggeven hebben dan een kind.

Nog een vraag dan waarom krijg ik het (bijna) dubbele aantal records terug als ik er RIGHT van maak? In mijn domme hoofd zou ik denken dat ik het zelfde als de LEFT JOIN uitvoer alleen dan met een lege c1 :?

edit:

dit was een trage reactie op Erkens idee

[edit2] nee dus want dat zijn alleen de rows die parent_id 0 hebben 8)7

[ Voor 14% gewijzigd door Gods Lonely Man op 28-10-2004 11:28 ]

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

Topicstarter
ik heb dus een tabel met daar in id en parent_id
code:
1
2
3
4
5
6
7
8
9
    |id|  |parent_id|
    ____  _____
    |1 |  | 0 |
    |2 |  | 0 |
    |3 |  | 0 |
    |4 |  | 1 |
    |5 |  | 1 |
    |6 |  | 2 |
    ----  -----

En nu wil ik alleen de rows terug hebben die niets onder zich hebben,
dus in dit geval id 3,4,5 en 6
Hoe moet dat?
Ik kom nu dus uit op dit:
code:
1
2
3
4
5
SELECT * 
FROM categorie c1 
LEFT JOIN categorie c2 
   ON (c1.parent_id = c2.id)
ORDER BY c1.categoriecode,c1.parent_id

Maar dan haal ik juist de rows op die niets BOVEN zich hebben,
Ik moet dus het omgekeerde hebben alleen 'c1.parent_id != c2.id' werkt natuurlijk niet..
hoewel?

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

http://www.sitepoint.com/print/hierarchical-data-database

Maakt het allemaal een stuk server vriendelijker. :)

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.

Pagina: 1