Rekursive Funktion läuft ins unendliche

xtramen01

Erfahrenes Mitglied
Hallo Leute,

ich habe versucht eine rekursive Funktion zu erstellen.
Leider läuft die Funktion ins unendliche.
Hat jemand eine Idee was ich übersehen habe?

PHP:
function cat_menue($parent_id)
{
	global $db;
    static $ebene = 0;

    $db->query("SELECT * FROM `admin_menue` WHERE `menue_parent_id` = '".$parent_id."'");
    while($row = $db->fetch_array()){


		$output .= $row['menue_name'];
		$output .= cat_menue($row['menue_parent_id']);

	}



	return $output;

}

Gruss
 
Grüße,

das kommt denke ich mal auf die Anzahl der Datensätze in deiner Datenbanktabelle an.
Irgendwann würde er sowieso aussteigen, wenn es keinen gültigen Schlüssel mehr gibt, denn irgendwo muss es ja anfangen (ganz oben kann ja dann nur noch 1 Elternelement stehen).

Weiterhin ist es niemals ratsam eine rekurisve Funktion zu schreiben, wenn es auch eine iterative Lösung gibt, da dabei die Laufzeit ganz schnell mal sehr groß werden kann :eek: -> in deinem Fall wird die Datenbank auch sehr beansprucht...
Aber wie oben schon erwähnt, gibt es kein Element, was einen Abbruch verursachen würde (bsp. Zählvariable oder ähnliches).

Vllt. wäre es sinnvoll die 2 Spalten aus der DB auszulesen und in einem globalen Array abzulegen. Danach könnte man dann mit einer entsprechenden Funktion sortieren lassen.

Wären jetzt meine Gedanken. Mal sehen, ob es noch andere Meinungen gibt.
 
Hi Alex_T,

habe da einen Fehler gemacht.
In der Rekursion sollte $row['menue_id'] stehen und nicht $row['menue_parent_id'].
Leider funktioniert es noch immer nicht wie gewollt.

Sobald ich die Funktion in der Funktion aufrufe wird mir nur ein Ergebnis geliefert.

Die Datenbank hat 3 Testeinträge und sieht folgendermaßen aus:

menue_id = 1
menue_parent_id = 0
menue_name = Parent 1

menue_id = 2
menue_parent_id = 0
menue_name = Parent 2

menue_id = 3
menue_parent_id = 1
menue_name = Sub von Parent 1

Die Funktion sieht nun folgendermaßen aus:

PHP:
function cat_menue($parent_id = '0')
{
	global $db;

    $db->query("SELECT * FROM `admin_menue` WHERE `menue_parent_id` = '".$parent_id."'");
    while($row = $db->fetch_array()){

		$output .= $row['menue_name'];

		$output .= cat_menue($row['menue_id']);



	}



	return $output;

}

Und die Ausgabe ist:

Parent 1
- Sub von Parent 1

Dannach ruft sich die Funktion anscheinend nicht mehr auf.
Ich weis leider keinen Rat mehr. Ich wüßte auch nicht wie ich es anders lösen könnte.

Gruß
 
Grüße nochmal,

also die menu_id sieht mir stark nach einer Key-Spalte aus, was dann natürlich bei fortlaufenden Inkrementierungen schwierig werden könnte, da noch alles sauber zuzuordnen.

Hier mein Vorschlag (dürfte für 2-stufige Bäume ausreichen):
du behältst deine Spalte menu_parent_id bei und fügst noch eine weitere hinzu (ich hab die hier mal number genannt).
Das hat folgenden Grund -> eindeutige Zuordnung:

- alles was bei "menu_parent_id" eine 1 stehen hat und bei "number" keine 0 ist eindeutig ein Kindelement von Parent1
(man kann das unendlich aufziehen

Sieht dann ungefähr so aus:

menu_id = ~
menu_parent_id = 1
number = 0
menu_name = Parent1


menu_id = ~
menu_parent_id = 2
number = 0
menu_name = Parent2


menu_id = ~
menu_parent_id = 1
number = 1
menu_name = Sub1 von Parent 1

menu_id = ~
menu_parent_id = 1
number = 2
menu_name = Sub2 von Parent 1

mit einer entsprechenden Abfrage...

PHP:
$sql = mysqli_query($db, "SELECT * FROM admin_menue WHERE menu_parent_id = ".$parent_id." AND number != 0");

//dann noch der Rest

VORSICHT: Ich habe den Code nicht getestet.
 
Hi und Danke für die Ausführung.

Leider genügt eine 2 stufige Hierarchie nicht.

Also mein Logik sagt mir, das dies so gehen muss. Was es aber nicht tut :-/
Meiner Meinung nach ist die Abfrage doch sehr Eindeutig.

Alle Einträge welche parent_id = 0 sind Eltern Elemente in der ersten Ebene.
In der Rekursion werden dann alle Einträge abgefragt, welche darunter liegen.

Das klappt ja auch. Aber eben nur einmal. Was mich echt dermaßen aufregt :-).

Die While Schleife läuft ja solange weiter bis kein Ergebnis mehr zu finden ist.
Deshalb sollte ja auch kein Zähler benötigt werden.

Ach ich weis auch nicht. Ich schaue ob ich ne Lösung finde.

Gruß und Dankeschön
 
Sorry fürs Doppelposting:

Ich habe gerade eine andere DB Klasse ausprobiert. Mit dieser Funktioniert es komischerweise.
Weis zwar nicht warum...gibt ne lange Nacht :-)

Gruss
 
Das währe genau meine Frag gewesen: Was ist $db?
Der Fehler musste dort drin sein. Alles andere währe unlogisch.
 
Zurück