![]() |
[PHP] Drop Down Menu aus Datenbank auslesen
Hi
Ich hab mich endlich wieder nach einiger Zeit dazu aufmuntern können für nen Freund eine Homepage zu machen. Der Typ will aber besonders viel, was ja nicht das Problem ist. Der erste Knackpunkt ist das Menu. Es soll insgesamt 2 Ebenen haben. Weiters soll das Menu in einer Tabelle in der Datenbank gespeichert werden, damit er die Menupunkte dann bequem ändern kann etc. CMS-Style eben Sprich: Menu 1 - Menu 1.1 Menu 2 - Menu 2.1 - Menu 2.2 Jedenfalls habe ich bereits eine Datenbank angelegt und die zugehörige Tabelle bereits mit Werten gefüllt. Wie ich dann den Algorithmus angesetzt habe hats schon gescheitert. ich kann die erste Ebene wunderbar auslesen, aber sobald es darum geht, die Children zu suchen und richtig einzutragen funktioniert die ausgabe der Children nichtmehr. Code:
$sql = "SELECT * FROM menu"; Wenn sich jemand erbarmen könnte da nen Blick drauf werfen könnte und mir sagen könnte wieso die Ausgabe nicht geht dann wäre ich sehr dankbar dafür. Aja die Struktur der Menu-Tabelle hät ich ganz vergessen: 1. Spalte: id (Laufvariable) 2. Spalte: site_id (Seitenindex - mit Hilfe dieser Nummer erzeuge ich dann den passenden Content über eine andere Funktion) 3. Spalte: parent_id (Enthällt die site_id wo der aktuelle Eintrag untergeordnent ist. Wenn dieser Eintrag leer ist, dann gibts es kein Parent, also Hauptmenüpunkt) 4. Spalte: menu_name (der dann angezeigte Name) Herzlichen Dank Stunk70 |
stichpunkte: datenstrukturen und rekursive algorithmen.
ich versuche gar nicht genau zu verstehen warum dein programm nicht läuft - dazu ist der code zu konfus ($ausgabe0, $ausgabe[1], $ausgabe2, $ausgabe[3] ... ? mal ein string, mal ein array). weiterhin 2x das gleiche sql-query "SELECT * FROM menu" ? da steckt massiv der wurm drin. also: das sql 1x ausführen, und aus dem ergebnis den menübaum aufbauen. dann den baum traversieren und gewünschten output erzeugen. weil ich grade keine DB zur hand habe, das menu als statisches array $data. wichtig ist: die hauptkategorien müssen 0 als parent_id haben (statt "") => "update menu set parent_id=0 where parent_id="" or parent_id is null)" und damit korrekt einsortiert werden kann muss bei deinem sql noch ein order by parent_id erfolgen! weiterhin möchte dein kumpel bestimmt noch eine sortierung (sort int default 0) als zusätliche spalte bei menu hinterlegen können. dann sollte folgender code weiterhelfen: PHP-Code:
Code:
# php x.php |
Ach du dicke Flöte....
hmmm...gut dann werd ich das morgen gleich mal testen. Vorerst mal herzlichen Dank für die ausgesprochen UMFANGREICHE Hilfe. Hab mir eher erwartet, dass mir jemand nur sagt wo was umzuschreiben ist, dass mir aber jemand gleich ne ganze Klasse präsentiert ufff....erstaunlich wieviel brauchbare Menschen es noch auf dieser Welt gibt....ich hatte die Hoffnung fast verloren. Danke |
naja, mit deinem ansatz wirds - wenn es dann irgendwann mal läuft - ein tierisches gefrickel mit unnötig vielen zeilen code. da dachte ich, ich zeig mal lieber wie man es m.e. richtig macht.
für richtig große kategoriebäume (>> 1000 einträge) ist der code zum einsortieren nicht effizient. andererseits denke ich, daß wenn du den code verstehst, einen aha-effekt hast und damit was lernst. weiterhin empfehle ich dir dringend die einarbeitung in [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] falls du mit php webseiten aufziehst. das trennt design bzw. output von programmierung. es gibt fast nichts schlimmeres, als webseiten die php+sql+html+css+javas***** nicht sauber trennen, zu warten. ausserdem habe ich so viehische zahnschmerzen, daß ich froh über jegliche ablenkung bin... den code hab' ich nochmal überarbeitet, $parent_id als member von CAT ist unnötig. was man evntl. braucht ist $parent. noch 8h bis zum termin.... aua aua aua :( |
Also irgendwie hab ich die jetzt probiert einzubinden. Der Kategorieaufruf wäre doch der Teil hier oder?
PHP-Code:
Woran happerts da...oder bin ich simple doch noch etwas zu blöde für das ganze.... Aha Effekt hatte ich noch keinen, zumal ich den Source bei den ersten paar Malen durchlesen kein bisschen verstanden habe. :( |
naja, statt foreach ($data ...) machst du ein:
PHP-Code:
wenn < 5.3 dann setze erstmal private $children_sorted = true; damit nicht sortiert wird. |
Also ich hab da jetzt nen Testalgoritmus, der nicht ganz dem entspricht vorerst mal.
ich will zuerst mal das ganze so angehen, dass ichs verstehe also hab ich mir folgendes Überlegt: PHP-Code:
Das Ganze macht jetzt auch eine richtige Ausgabe. Schlichtweg am display:block happerts jetzt. Wieso ich mich vorerst für diese Umständliche Methode entschieden habe, nunja...das Menu auf der Projekttseite wird nicht all zu lang. insgesamt 13 Einträge hat das ganze Maximal. Da kann ich mir diese Art vorerst mal so implementieren. So und anchdem ich dann noch einige Fragen habe, hoff ich mal, dass dir die Fragerei nicht aufn Leim geht: Wozu ist das $indent = -1 ? MfG Sttunk70 PS: Herzlichen Dank! |
indent (einrückung) = -1
$root->ouput() -> $indent == -1, es wird nix ausgegeben wg. (if $this->id != 0) ... für alle kinder von $root ist $indent == 0, der deren kinder == 1 und deren == 2, ect. du machst ja deine einrückungen über geschachtelte ul, dann sähe output so aus (mit default $indent = 0) PHP-Code:
Code:
# php x.php |
OK. Danke dir.
Also ich hab meinen Fehler schon gefunden. Funktioniert jetzt alles einwandfrei. Zwar mit meinem Algorithmus, aber den werd ich in der kommenden Zeit eh stanzen und mich mal an die Kategorie sortierung von dir waagen. Das erste was ich mal machen werde ist mir das Smarty Dingens da anschauen. Das hab ich bis jetzt noch nie gesehen. xD Ich hab zwar schon Templates geschrieben/entworfen, aber nie wirklich verstanden warum bestimmte Dinge so oder so gemacht wurden. Schaumamal, dass ich das so mal auf die Reihe bekomme. Herzlichen Dank für deine Hilfe, hat mir einiges gebracht, ich hoff mal es war für dich auch die Mühe wert. MfG Stunk70 |
Wenn du sehr umfangreiche Bäume erstellen willst kannst du dir auch mal Nested Sets anschauen, was sich bei großen CMS-System mit vielen Katagerorien sicherlich besser macht, auch wenn es nicht ganz einfach ist. Die Performance ist beim auslesen aber um einiges besser, nur das Speichern ist nicht gerade einfach. Aber naja das auslesen, kann man mit Cache Systemen verbessern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.