MYSQL Navigationsstruktur auslesen

BergBenji

Grünschnabel
Hallo an alle!

Mein Wunsch/Ziel ist es die gesamte navigation der Seite als Strukturbaum anzuzeugen.
Dafür habe ich die Datenbank wie folgt angelegt:

Datenbank sieht wie folgt aus:
ID | bezug_ID | aufgabe | titel

Die bezug_id bezieht sich immer auf eine "Übergeordnete ID".
bsp:
ID | bezug_id | aufgabe | titel
1 | 0 | show | Startseite
2 | 1 | show | News
3 | 1 | show | Members
4 | 1 | show | Forum
5 | 2 | insert | Neue News anlegen
6 | 2 | delete | News löschen
etc...




Ich habe im moment folgendes:
Code:
echo"<b>Startseite <br /></b>";
$sqlbefehl= "SELECT * FROM $tab_org_lay";
$result=mysql_query($sqlbefehl, CONN);
while($list= mysql_fetch_array($result))
	{
	if($list['bezug_id'] == $topkat)
	{	echo '<div style="margin-left: '.$abstand1.' px;">I -- &nbsp; <b>'.$list['titel'].' ('.$list['id'].')</b></div>';

$sqlbefehl_int="SELECT * FROM $tab_org_lay where bezug_id=$list[id]";
	$resint=mysql_query($sqlbefehl_int, CONN);
	while($listint=mysql_fetch_array($resint))
	{	echo '<div style="margin-left: '.$abstand2.' px;"> II -- &nbsp;	<u>'.$listint['titel'].' ('.$listint['id'].')</u></div>';
						
$sqlbefehl_iint="SELECT * FROM $tab_org_lay where bezug_id=$listint[id]";
	$resiint=mysql_query($sqlbefehl_iint,CONN);
	while($listiint=mysql_fetch_array($resiint))
	{	echo '<div style="margin-left: '.$abstand3.' px;"> III -- &nbsp; <em>'.$listiint['titel'].' ('.$listiint['id'].')</em></div>';
								
$sqlbefehl_iiint="SELECT * FROM $tab_org_lay where bezug_id=$listiint[id]";
	$resiiint=mysql_query($sqlbefehl_iiint,CONN);
	while($listiiint=mysql_fetch_array($resiiint))
	{	echo '<div style="margin-left: '.$abstand4.' px;"> IV -- &nbsp;	<b><em>'.$listiiint['titel'].' ('.$listiiint['id'].')</em></b></div>';
					
$sqlbefehl_iiiint="SELECT * FROM $tab_org_lay where bezug_id=$listiiint[id]";
	$resiiiint=mysql_query($sqlbefehl_iiiint,CONN);
	while($listiiiint=mysql_fetch_array($resiiiint))
	{	echo '<div style="margin-left: '.$abstand5.' px;">V -- &nbsp;<b><em>'.$listiiiint['titel'].' ('.$listiiiint['id'].')</em></b></div>';
							
$sqlbefehl_iiiiint="SELECT * FROM $tab_org_lay where bezug_id=$listiiiint[id]";
	$resiiiiint=mysql_query($sqlbefehl_iiiiint,CONN);
	while($listiiiiint=mysql_fetch_array($resiiiiint))
	{	echo '<div style="margin-left: '.$abstand6.' px;">VI -- &nbsp;<b><em>'.$listiiiiint['titel'].' ('.$listiiiiint['id'].')</em></b></div>';
	} } } } }}
}

Wenn ich nun aber noch eine weitere Unterkategorie bekomme, müsste ich eine weitere Abfrage und wieder eine schleife einsetzten.

Gibt es ne möglichkeit das alles in einer Klasse zu machen?!


Ich danke allen im vorraus!
 
Zuletzt bearbeitet:
Rekursion muss nicht immer über Funktionen ablaufen, den Stack kann man sich in vielen Fällen auch selber bauen und vielleicht spart man damit sogar etwas Laufzeit. Die Anzahl der Datenbankabfragen ist aber bei jeder Rekursionsart gleich, daher solltest du hier wirklich lieber das von Gumbo empfohlene Modell nutzen.

Da ich den Code jetzt sowieso schon fertig habe, kann ich ihn ja trotzdem mal anhängen, vielleicht kann da ja nochmal jemand was mit anfangen oder findet noch Denkfehler:

PHP:
$stack[] = mysql_query('SELECT * FROM a WHERE b = 0');

while (count($stack) > 0) {
	$result = end($stack);
	
	while ($list = mysql_fetch_array($result)) {
		echo '..';
		
		$result2 = mysql_query('SELECT * FROM a WHERE b = '.$list['id']);
		if (mysql_num_rows($result2) > 0) {
			$stack[] = $result2;
			break;
		}
	}
	if ($result == end($stack)) {
		array_pop($stack);
	}
}

Die Rekursionstiefe könnte man hierbei an count($stack) ablesen...
 
@ Papier hat leider nicht so ganz funktioniert

@ Gumbo habe leider eine Feste vorgabe von meinem Teamleiter es so zu machen :( ich selber haette es auch anders gemacht

ABER
habe es folgendermaßen hinbekommen:
(Ich poste es mal vielleicht braucht jemand sowas nochmal)
Code:
function getstrukturtree($getheadid){
  //get headlines
  $x=1;
  $abstand=5;
  global $tab_org_lay;
  $sqlbefehl='SELECT * FROM '.$tab_org_lay.' WHERE bezug_id='.$getheadid;
  //echo"$sqlbefehl <br />";
  $result=mysql_query($sqlbefehl, CONN);
  $x=1;
     if(mysql_num_rows($result) >= 1)
        {$ausgabe.="<ul>";
	while($list=mysql_fetch_array($result))
	{
		
	$abstandl=$abstand * $x;
	$ausgabe.='<div style="margin-left:'.$abstandl.'px;"><il><b>'
	$list['bezug_id'].'</b>-<em><b>'. $list['titel'] .'</b></em>-<b>'.$list['id'].
	'</b></il></div>';
				
	$ausgabe.=getstrukturtree($list[id]);
	}
	$ausgabe.="</ul>";
	$x++;
       }
return $ausgabe;
}

echo getstrukturtree(0);

Funktioniert genau wie ich es mir vorgestellt habe und sieht dazu noch ganz angenehm aus!

Danke aber für die Antworten - welche mir einen Großen Denkanstoß gegeben haben (nach ca 2 1/2 stunden war es dann vollbracht :rolleyes: )

MFG Benji
 
Zuletzt bearbeitet:
Zurück