Baumstruktur dynamisch aus datenbank erzeugen lassen

eViLaSh

Erfahrenes Mitglied
Hallo,

ich steh vor einem riesen Problem, und weiss leider nicht wie ich es angehen soll.

also ich habe eine Datenbank, die sieht so aus:

[cat_id][cat_pid][cat_name][cat_preis][cat_online]

so, da stehen also meine Kategorien drinne, cat_pid bezieht sich praktisch auf die überkategorie!

meine Ausgabe soll nun wie foglt aussehen....ich möchte das ganze ein mal ganz auslesen und die ganze baumstruktur ausgeben, diese soll dann mit div layern untereinander angesprochen werden können... das ganze sieht halt dann so aus:

HTML:
<div id="id1" style="display:block;"><A href="javascript:sh('id1_1', 'bid1_1')" class="links"><img name="bid1_1" src="../images/aufbau/cat_plus.gif" width="9" height="9" border="0"></a>kat1<br></div>
              <div id="id1_1" style="display:none;"><img src="../images/aufbau/pix.gif" width="28" height="8"> kat1_1<br>
                                                    <img src="../images/aufbau/pix.gif" width="28" height="8"> kat2_1<br>
                <img src="../images/aufbau/pix.gif" width="15" height="8"> <A href="javascript:sh('id4_3', 'bid4_3')" class="links"><img name="bid4_3" src="../images/aufbau/cat_plus.gif" width="9" height="9" border="0"></a>kat3_1<br>
              <div id="id4_3" style="display:none;"><img src="../images/aufbau/pix.gif" width="56" height="8"> kat4_3<br>
                  <img src="../images/aufbau/pix.gif" width="56" height="8"> kat5_3<br>
                </div>
                <img src="../images/aufbau/pix.gif" width="9" height="8"> kat6<br>
              </div>

das JS sieht dann noch so aus:
HTML:
<!--


function sh(id, bid)
{

  if(document.getElementById(id).style.display == 'none'){
    document.getElementById(id).style.display = 'block';
    document [bid].src = "../images/aufbau/cat_minus.gif";


  }else{
    document.getElementById(id).style.display = 'none';
	document [bid].src = "../images/aufbau/cat_plus.gif";
  }
}
//-->

so, die ausgabe, wie sie aussehen soll hab ja nun schonmal :-)

wie schaffe ich es nun, das ganze über die datenbank auslesen zu können, und den baum dynamisch erzeugen zu lassen!

ich steh da total aufm schlauch
 
Könntest du etwas detailierter beschreiben, was wie in id und pid steht....
Was steht bspw. bei einer Hauptkategorie unter pid?
Und was steht bei einer Unterkategorie unter id?

....möglichst genau bitte...und gibt es mehr als 9 Hauptkategorien/Unterkategorien bzw. ist das geplant?
 
sorry, das ich mich so lang nich gemeldet hab, hatte allerhand um die ohren...

also:

meine DB schaut so aus:

db.gif


dabei ist z.B. Spiele die hauptkategorie von Kartenspiele, die wiederum die HK von magic...

usw. die pid sagt also wer der "parent" welcher kategorie ist...

Spiele parent von Kartenspiele
Garten parent von Rasenmäher
usw.

es soll keine grenze nach oben offen sein, es kann also theoretscih 1000 unterkategorien geben...
 
Zuletzt bearbeitet:
Oliver Gringel hat gesagt.:
:google: mal unter dem Begriff "Nested Set". Das sollte für dein Vorhaben das beste sein.


ne ich will das schon mit id ind pid machen, die struktur verstehe ich ja auch... mein problem ist nur, wie ich das mit meiner ausgabe hin bekomm ...
 
Oliver Gringel hat gesagt.:
Dann bleibt dir nur ein rekursiver Ansatz. Das ist aber nicht zu empfehlen, weil es grottenlangsam wird, wenn es mal ein paar Ebenen tief geht.

das wäre egal, der baum wird ja nur einmal erstellt...

und zugegriffen wird auch nicht oft, ist nur für administrative zwecke...

aber wie sieht so was rekursives aus... ich hab einfach probleme mit den verschachtelungen der div layer...
 
Du hast ne Funktion, die dir alle Childs zu einem bestimmten Parent ausliest. Diese Funktion rufst du für Parent=0 auf. In der Funktion rufst du dann die selbe Funktion mit Parent=Child auf. Das geht dann so tief, bis es keine Childs mehr zu einem Parent gibt.
Du solltest mal bei :google: nach Rekursion suchen, und dich mal ein bisschen Informieren, was es damit aufsich hat.

Btw. der Baum wird jedesmal erstellt, wenn du auf die Seite gehst.
Ich würde dir noch empfehlen, erst alle Datensätze abzufragen, und in ein Array zu schmeissen, und damit die Rekursion zu machen. Sonst wird hast du bei jedem Funktionsaufruf ein SQL-Query, und das zwingt deinen Server ganz schön in die Knie.
 
Zuletzt bearbeitet:
Oliver Gringel hat gesagt.:
Du hast ne Funktion, die dir alle Childs zu einem bestimmten Parent ausliest. Diese Funktion rufst du für Parent=0 auf. In der Funktion rufst du dann die selbe Funktion mit Parent=Child auf. Das geht dann so tief, bis es keine Childs mehr zu einem Parent gibt.
Du solltest mal bei :google: nach Rekursion suchen, und dich mal ein bisschen Informieren, was es damit aufsich hat.

Btw. der Baum wird jedesmal erstellt, wenn du auf die Seite gehst.
Ich würde dir noch empfehlen, erst alle Datensätze abzufragen, und in ein Array zu schmeissen, und damit die Rekursion zu machen. Sonst wird hast du bei jedem Funktionsaufruf ein SQL-Query, und das zwingt deinen Server ganz schön in die Knie.


also soweit bin ich eigentlich schon... nur mit dem erstellen haperts eben bei mir...puh, das is aber auch kompliziert :(

hm, du sagst das ich erst alles in ein array lesen soll ok... wie kann ich das denn dann wie mit
PHP:
mysql_query("select * from tabelle where cat_pid = '$cat_id'");

abfragen, gibts da ne möglichkeit ?
 
Zurück