Fehlermeldung in Tutorial - Notice: Undefined offset:

xtramen01

Erfahrenes Mitglied
Hallo Leute,

habe mir aus dem Tutorial:

http://www.tutorials.de/forum/php-tutorials/27144-menusystem-mit-php-und-mysql.html

eine NAvigation gebaut.
Leider bekomme ich ein Notice. Und zwar wenn ich eine Hauptkategorie mit z.b. 2 Unterkategorien erstelle die aufklappen sollen und dabei die Hauptkategorie anklicke.
Dann erscheint pro Unterkategorie jeweils der selbe Fehler:

Notice: Undefined offset: 2 in .....on line 73

Die Zeile ist folgende:

if ($row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion).....

Und hier mal der ganze Code. Vielleicht weis ja jemand wie man die Meldung weg bekommt.

PHP:
<?PHP
$link = mysql_pconnect("localhost","wwwrun");
$err  = mysql_select_db("menusys",$link); # das sollte klar sein wir rufen unsere db an.

# und hier kommt der code kurz aber schwer zu verstehen ...
function baum($vater,$lpos) #vater welches menu wird gezeigt ; in lpos wird meine liste aufgebaut für den nächsten klick
{
    global $link;  # Der Link zur DB durch global auch in der Funktion bekannt.
    global $wahl;  # hier sind als Array die ids drin die aufgeklappt sind (kommt aus der var pos)
    static $ebene = 0; # mit static erstelle ich eine Variable, die beim erneuten 
                        # Aufruf der Funktion den Wert aus der Vorgängerfunktion behält.
                        # Die ist wichtig für die Rekursion. Der Startwert ist 0 und der
                        # wird hochgezählt beim Neuaufruf. Wenn ich also im Menu bei Apfel bin,
                        # ist der Wert bei 1.

    $erg[$ebene] = mysql_query("SELECT * FROM `menu` WHERE `vater` = '$vater'",$link);
    $menge = mysql_num_rows($erg[$ebene]);
    # Das ist auch noch klar. Lese das aktuelle Menu aus der Datenbank aus und starte eine Schleife ...
    for ($lo=0;$lo<$menge;$lo++) {
        $row = mysql_fetch_row($erg[$ebene]);    # Den Menu Eintrag auslesen, in $row[1]
                                                # ist ja der menueintrag als text ..
        $menu = "<a href=\"baum.php3?pos=".$lpos."|".$row[0]."\">".$row[1]."</a><br>";
        # Hier bastel ich den Link zusammen. Am schwersten zu verstehen ist wohl
        # pos=$lpos|$row[0], ich werde noch näher darauf eingehen.

        if ($ebene > 0) {    # Hier rücke ich einfach nur ein, je tiefer ich im Menu(Rekursion)
                            # bin, umso mehr Leerzeichen vorne dran
            echo str_repeat("&nbsp;",$ebene);
        }

        echo $menu;
        if ($row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion)
            $ebene++; # ein Level hoch
            baum($row[0],$lpos."|$row[0]");
            $ebene--; # und wieder ein Level runter
        }
    }
}

Gruss
 
Moin,

kenne das Tutorial zwar nicht, aber schau mal, was passiert:

Tausche
PHP:
if ($row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion)

durch
PHP:
if (isset($wahl[$ebene+1]) && $row[0] == $wahl[$ebene+1]) { # Hier folgt der Aufruf der Funktion (ab in die Rekursion)
 
Hi nochmal,

grundsätzlich empfiehlt es sich, beim iterieren durch ein Array auch zu prüfen, ob es ein Objekt am iterierten Index gibt. Ich meine damit folgendes:

PHP:
$a = array(1, 2, 3, 4);

for ($i = 0; $i < 10; $i++)
   echo $a[$i] . '<br/>';
Das wird Fehler werfen, man sieht es sofort. So lange man nicht vorher sagen kann, wieviele Elemente ein Array hat und mit wieviel Durchläufen man arbeiten muss (in deinem Fall ist die Anzahl der Durchläufe ja noch zusätzlich dynamisch) muss man den aktuellen Array-Index prüfen, bevor man darauf zu greift. In anderen Sprachen wäre es noch verheerender, das nicht zu tun (NullPointer Exception in Java z.B., C würde das Programm sogar mit einem Segmentation Fault abstürzen lassen). Immer brav prüfen, dann passiert sowas nicht:

PHP:
$a = array(1, 2, 3, 4);

for ($i = 0; $i < 10; $i++)
   if(isset($a[$i])) echo $a[$i] . '<br/>';
 
Zurück