PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Dynamisches erstellen eines Navigationsmenüs (http://www.selfphp.de/forum/showthread.php?t=23008)

knight1 20.03.2010 22:47:59

Dynamisches erstellen eines Navigationsmenüs
 
Hi SELFPHP-Com,
ich habe momentan ein Problem mit dem dynamischen erstellen eines Navigationsmenüs.
Die Tabellen-Struktur sieht folgendermaßen aus:
Code:

id bigint(20) UNSIGNED auto_increment             
name varchar(255)
site varchar(255)
parent_id bigint(20) UNSIGNED
year_disposal enum('0','1')
order int(11)
active enum('0','1')

Der Inhalt der Tabelle sieht folgendermaßen aus:
Code:

id|name|site|parent_id|year_disposal|order|active
1|Home|home|0|0|1|1
2|Über mich|about_me|0|0|2|1
3|Projekte/Referenzen|projects|0|0|3|1
4|Kontakt|contact|0|0|4|1
5|Impressum|imprint|0|0|5|1
6|Nützliches/Dies und Das|usefull|0|0|6|1
7|Smilies|smilies|6|0|1|1
8|Feiertage und Ereignisse|holidays|6|1|2|1

Ich habe mir eine rekursive Funktion geschrieben welche mir die Darstellung des Menüs übernehmen soll.
Hier mal den Code der Funktion:
PHP-Code:

function navigation ($parent_id,$level,$mysqli)
{
$return = array();
$query $mysqli->query("
SELECT
*,
`id` AS `sub_id`,
(SELECT COUNT(*) FROM `"
.MYSQL_TABLE_PAGES."` WHERE (`parent_id` = `sub_id`)) AS `count`
FROM
`"
.MYSQL_TABLE_PAGES."`
WHERE
(
    (
        (`parent_id` = '0') ||
        (`parent_id` = '{$parent_id}')
    ) &&
    (`active` = '1')
)
ORDER BY
`order` ASC
"
);
$rows $query->num_rows;
 while (
$result $query->fetch_array(MYSQL_ASSOC))
 {
 
$hyphens "";
  for (
$x=1;$x<=$level;$x++) { $hyphens .= "-"; }
 
$year "";
  if (
$result['count'] == 0)
  {
   if (
$result['year_disposal'] == 1) { $year "&amp;year=".CURRENT_YEAR; }
  
$return[] = "{$hyphens} <a href=\"content.php?site={$result['site']}{$year}\" target=\"content_frame\">{$result['name']}</a><br>";
  }
  if (
$result['count'] >= 1)
  {
  
$return[] = "{$hyphens} <a href=\"navigation.php?cat={$result['id']}\" target=\"_self\">{$result['name']}</a><br>";
  }
  if (
$parent_id == $result['id'])
  {
  
$return[] = navigation($result['id'],$level+1,$mysqli);
  }
 }
RETURN 
implode($return);


Der initiative Aufruf der Funktion erfolgt folgendermaßen
PHP-Code:

echo navigation($_GET['cat'],1,$mysqli); 

an der Stelle wo das Menü hinkommen soll.
Wenn ich keinen der Unterpunkte anzeigen lasse, dann wird das Menü korrekt dargestellt und es werden keine Fehler ausgegeben.
Wenn ich mir aber die Unterpunkte des Menpunkts "Nützliches/Dies und Das" (Ist momentan der einzige mit Unterpunkten) anzeigen lassen möchte kommt die Fehlermeldung
Code:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in Pfad zur Datei/navigation.php on line 45
Die Zeile 45 ist folgende:
PHP-Code:

$return[] = navigation($result['id'],$level+1,$mysqli); 

Ich kann mir nicht erklären worauf sich der Fehler beziehen soll. Ich habe schon den Parent-ID-Parameter als Zahl manuell definiert und auch die $mysqli-Methode per GLOBAL in die Funktion importiert. Es kommt aber jedesmal erneut der Fehler.

Vielleicht sehe ich ja vor lauter Bäumen den Wald nicht mehr.


Für Tipps wäre ich dankbar.


Kai aka Knight1

cortex 22.03.2010 08:44:53

AW: Dynamisches erstellen eines Navigationsmenüs
 
ohne jetzt deinen quelltext genauer anzuschauen: die fehlermeldung deutet darauf hin, dass die rekursion ins unendliche läuft. ich würde zum debuggen mal die übergebenen variablen (result und level?) ausgeben.

cx

knight1 22.03.2010 19:36:27

AW: Dynamisches erstellen eines Navigationsmenüs
 
Danke cortex für Deine Antwort,
Zitat:

Zitat von cortex (Beitrag 135368)
...die fehlermeldung deutet darauf hin, dass die rekursion ins unendliche läuft. ...

Der gedanke kam mir auch schon. Ich hatte aber keine Idee wie ich das testen kann.

Zitat:

Zitat von cortex (Beitrag 135368)
...ich würde zum debuggen mal die übergebenen variablen (result und level?) ausgeben.

cx

Ich habe mal die Variable $level innerhalb der Funktion ausgegeben, und siehe da, diese Variable läuft bis auf 1004 hoch bevor das Script in das Speicherlimit reinläuft.

Ich stelle mir schon länger die Frage warum der PHP-Interpreter bei einem (teilweise deutlich) geringeren Wert als dem der in der php.ini eingetragen ist in der Error läuft.

Ich habe mich dazu entschlossen eine einfachere Variante des Menüs ohne Unterkategorien zu bauen.

Trotzdem Danke für die Antwort.

Ich werde mit Sicherheit irgendwann nochmal auf das Thema zurückkommen.



Kai aka Knight1


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:46:12 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.