MySQL-Tabelle rekursiv auslesen

  • Hallo,


    ich habe ein kleines Problem:


    ich habe eine MySQL-Tabelle, die Produktkategorien enthält. Jede Kategorie kann beliebig viele Unterkategorien haben, jede Unterkategorie wieder beliebig viele weitere Unterkategorien usw. Die Tiefe der Verschachtelung ist nicht begrenzt.


    Die Struktur der Tabelle ist wie folgt:


    Feld:
    catid
    pid
    tid
    catname


    catid ist die eindeutige ID-Nummer jeder Kategorie.
    pid ist die ID der übergeordneten Kategorie
    tid ist die ID der übergeordneten Kategorie des obersten Levels, welche immer die pid=0 hat
    catname der Name der Kategorie


    Ich versuche jetzt, eine Funktion zu bauen, die es mir erlaubt, von einer beliebigen Kategorie aus alle Unterkategorien zu ermitteln und in ein Array zu übergeben, dass danach ausgewertet werden kann.


    Die Funktion sieht bis jetzt so aus:

    Aufgerufen wird die Funktion an einer beliebigen Stelle des Skripts über:

    PHP
    1. $subcats=findsubcats($catid)

    wobei $catid die ID einer beliebigen Kategorie sein soll.


    Zurückgeben soll die Funktion ein Array mit allen Unterkategorien. Und eben diese Rückgabe funktioniert so nicht.


    Wenn ich mir innerhalb der while-Schleife die Variable $id per echo anzeigen lasse, sehe ich, dass tatsächlich alle Subkategorien gefunden werden, aber der Aufbau des Arrays $liste funktioniert nicht.


    Am Ende enthält $subcats nur die IDs der Subkategorien im ersten untergeordneten Level.


    Ich hoffe, ich habe mich jetzt einigermaßen verständlich ausgedrückt :(


    Hat jemand eine Idee, wo hier der Fehler liegt? Ich grübele jetzt schon seit 2 Tagen über Sache und komme alleine wohl nicht mehr weiter.


    Gruß
    Wolfgang

  • ... sondern informiere Dich zum Thema "nested sets"....
    Du wirst hier im Forum dazu fündig. ;)


    Genau, und zwar direkt eine Tür weiter im Tutorial Board: Nested Set

  • ich meine den Baum abzubilden, da gibt es mehrere Möglichkeiten, hier mal eine


    PHP
    1. $tree=array();
    2. while($row=mysql_fetch_assoc($res)) {
    3. $tree[$pid][]=$row['catid'];
    4. }


    jetzt kannst Du entweder in der Ursprungstabelle zu jeder Kategorie den Baum ablegen, z.B.
    $cattree=serialize($tree[$catid]);
    oder eine Kommaliste produzieren und in eine eigene Tabelle eintragen.


    Sicher gibts noch mehr Möglichkeiten.

  • Nachdem ich mich jetzt mal näher mit dem Thema Nested Sets beschäftigt habe, habe ich mich entschlossen, dass Problem auf diese Weise zu lösen. Funktioniert bis jetzt einwandfrei. Und die Datenbank werde ich halt neu erstellen, ist zwar ein wenig aufwendig, aber ich denke, der Aufwand lohnt sich.


    Vielen Dank für eure Tipps! :)