PHP MySQL menu

Tags:    php mysql menu

Hejsa.

Jeg ville da lige dele min kode med alle andre som jeg sad og fandt på i går.

Det hele kommer sig af at jeg gerne ville have min menu lagt ned i databasen, bl.a for at kunne styre hvilken rækkefølge de skal ligge i samt ændre navnene nemt på menupunkterne.

Her finder du databasestrukturen samt lidt dummy data
Fold kodeboks ind/udKode 


Her følger så min kode der hente menuen
Fold kodeboks ind/udPHP kode 


På topmenuen findes der noget kode som udskriver et icon. Denne linje kan man fjerne hvis man ønsker, jeg har anvendt da jeg skal bruge det i min menu

Man kan så hvis man vil have flere niveauer på tilføje flere if statements i while løkken submenu.

Jeg kunne godt tænke mig at høre nogle kommentar på koden.
Jeg ved godt jeg kan gøre det anderledes, men jeg har aldrig forstået de andre, denne her forstår jeg lidt nemmere.



Indlæg senest redigeret d. 07.10.2011 09:18 af Bruger #15663
4 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Grunden er optimering...

Hvis du kan generere samme output ved 1 SQL kald, som du kan ved 200 SQL kald, så vil jeg nok kalde det meget bedr optimeret. Med den kode herunder(som også tidligere er skrevet) kan du med eet SQL kald, et loop og en enkelt rekursiv funktion generer samme output som din kode.

Fold kodeboks ind/udPHP kode 


Lidt forklaring:

  1. Et SQL kald, giver et datasæt der ligner hvad $menuitems indeholder.

  2. Dette er den kreative del - Kort fortalt, gennemløbes alle rækker i tidligere datasæt og indekseres herefter. Normalt når man skriver "=" allokerer man et nyt område i hukommelsen til en variabel. Bruger man =& laver man reference til to ens områder.

  3. Start med rod-noden.

  4. En rekursiv funktion som gennemløber alle elementer i et array. Rekursiv betyder at en funktion kalder sig selv et givent antal gange.

  5. Udskriv hvad vi har fra vores rekursive funktion.



For at forstå må man analysere... :)



Indlæg senest redigeret d. 07.10.2011 12:00 af Bruger #10216
Du må aldrig have database kald inde i loops.

Kig evt. det indlæg jeg skrev til dig vedr. samme emne her: http://www.udvikleren.dk/forum/35319/udskrive-menu-fra-mysql-med-children/



Så det du mener er at jeg bare skal flytte mit kald til min db uden fra mine loops?

Hvad er grunden til at man ikke må have kald til db inde i et loop?

Jeg har godt set det indlæg, problemet at bare at jeg på ingen måde forstår hvad det er der sker, det gør jeg ved det script jeg selv har lavet der?




Jeg vil ikke sige det er helt rigtigt at man aldrig må lave SQL i et loop. Men Michael har ret i at man skal passe på med at gøre det. Problemet er at det skalerer utrolig dårligt når man laver SQL'er i loops, men hvis man ved dybden aldrig er særlig stor og kan leve med konsekvenserne, er der ikke noget problem i det. Der findes andre måder at gøre det på end rekursion, men der findes ikke en rigtig god måde at gøre det på i en relationel database.
Derfor vil jeg mene man skal overveje om det kan gøres på en bedre måde og om det er besværet værd. Rekursion er nok den nemmeste måde at gøre det på, men nok også den metode der skalerer dårligst. Hvis menustrukturen er meget stor, bør man overveje andre metoder.




t