# dynamische Navigation mit MySQL



## dsNDesign (6. Januar 2009)

Hi,
ich versuche gerade ein Tutorial nachzumachen. Jedoch kommt bei mir immer ein Fehler.

Es geht um das Tutorial:
http://www.tutorials.de/forum/php-t...namischen-navigation-mit-hilfe-von-mysql.html


Bei mir kommt immer folgender Fehler:
Fatal error: Call to a member function query() on a non-object in /users/designers-place/www/cms/index.php on line 13

line 13 sieht bei mir wiefolgt aus:

```
$mysql->query("SELECT menu_ID, menu_name FROM menu WHERE menu_topid=0 and `menu_display` != '0' ORDER BY menu_position ASC");
```

Hier mal mein ganzer Code:

```
<div id="navi">
<?php include_once("db_menu.php");
$mysql->query("SELECT menu_ID, menu_name FROM menu WHERE menu_topid=0 and `menu_display` != '0' ORDER BY menu_position ASC");
$nav_array = array();
$i = 0;
while ($nav_data = $mysql->fetcharray()) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    $i++;
}  
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
$mysql->query("SELECT * FROM menu WHERE menu_ID = $nav_id");
$page_data = $mysql->fetcharray();
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  

$mysql->query("SELECT menu_ID, menu_topid, menu_name FROM menu WHERE menu_topid = $nav_id and `menu_display` != '0' ORDER BY menu_position");
$i = 0;
while ($subnav_data = $mysql->fetcharray()) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
    $mysql->query("SELECT menu_ID, menu_topid, menu_name FROM menu WHERE menu_topid = $next_topid ORDER BY menu_position ASC");
    //Die Tabelle auslesen
    while($subnav_data = $mysql->fetcharray()) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
		
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
	
   $child_array = $root_array;
    $root_array = array();  
	
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
    $mysql->query("SELECT menu_topid FROM menu WHERE menu_ID = $next_topid LIMIT 1");
    $subnav_data = $mysql->fetcharray();
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content");
$mysql->query("SELECT * FROM content WHERE content_ID = $page_id");
            $data = $mysql->fetcharray();
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
</div>
```

Wo liegt mein(e) Fehler? Ich komme einfach nicht drauf.

Grüße


----------



## Loomis (7. Januar 2009)

Das passiert, wenn man das Tutorial nicht richtig liest, bzw. nur den Code kopiert.
Dort steht nämlich ganz am Ende folgendes:


> ... *Die ganzen MySQL-Aufrufe gehen über eine eigene Klasse (in PHP5)*...


----------



## dsNDesign (7. Januar 2009)

und das heißt?
muss ich dann die MySql Aufrufe alle in ein extra <?php ?> machen oder?


----------



## Maniac (7. Januar 2009)

Das heist das du die Klasse brauchst welche er verwendet oder eben die aufrufe umschreiben


----------



## dsNDesign (7. Januar 2009)

und woher weiß ich, welche Klasse ich nehmen muss?


----------



## dsNDesign (7. Januar 2009)

so. ich hab jetzt mal ein bisschen was geändert.

Sieht jetzt so aus:

```
<div id="navi">
<?php include_once("db_menu.php");
$sql=mysql_query("SELECT menu_ID, menu_name FROM menu WHERE menu_topid=0 AND menu_display!=0 ORDER BY menu_position ASC") or die("Fehler".mysql_error());
$nav_array = array();
$i = 0;
while ($nav_data = mysql_fetch_array($sql)) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    $i++;
}  
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
$sql=mysql_query("SELECT * FROM menu WHERE menu_ID = $nav_id") or die("Fehler".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  

$sql=mysql_query("SELECT menu_ID, menu_topid, menu_name FROM menu WHERE menu_topid = $nav_id and `menu_display` != '0' ORDER BY menu_position") or die("Fehler".mysql_error());
$i = 0;
while ($subnav_data = mysql_fetch_array($sql)) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
    $sql=mysql_query("SELECT menu_ID, menu_topid, menu_name FROM menu WHERE menu_topid = $next_topid ORDER BY menu_position ASC") or die("Fehler".mysql_error());

    //Die Tabelle auslesen
    while($subnav_data = mysql_fetch_array($sql)) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
		
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
	
   $child_array = $root_array;
    $root_array = array();  
	
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
    $sql=mysql_query("SELECT menu_topid FROM menu WHERE menu_ID = $next_topid LIMIT 1") or die("Fehler".mysql_error());
    $subnav_data = mysql_fetch_array($sql);
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content.php");
$sql=mysql_query("SELECT * FROM content WHERE content_ID = $page_id") or die("Fehler".mysql_error());

            $data = mysql_fetch_array($sql);
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
</div>
```

Dazu sieht meine Datenbank so aus:
http://img3.imagebanana.com/img/c09ogtv/menu.jpg
http://img3.imagebanana.com/img/gzof18b/content.jpg

Jetzt kommt kein Fehler mehr. Dafür wird gar nichts mehr angezeigt.
Woran liegts das jetzt nun?
Ist am Code noch was falsch, oder habe ich in der Datenbank was falsch gemacht?


----------



## OFranzG (8. Januar 2009)

Ich weiß nicht, ob es etwas bringt, aber versuche doch mal, indem du die Befehle im SELECT in ein `   ` machst.
Also so: SELECT `menu_ID`, `menu_name` FROM `menu`....


----------



## dsNDesign (8. Januar 2009)

Hi,
danke für deine Antwort.
Leider führt dies zu keinem Erfolg.


```
<div id="navi">
<?php include_once("db_menu.php");
$sql=mysql_query("SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` !='0' ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());
$nav_array = array();
$i = 0;
while ($nav_data = mysql_fetch_array($sql)) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    $i++;
}  
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  

$sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != '0' ORDER BY `menu_position`") or die("Fehler".mysql_error());
$i = 0;
while ($subnav_data = mysql_fetch_array($sql)) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
    $sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());

    //Die Tabelle auslesen
    while($subnav_data = mysql_fetch_array($sql)) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
		
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
	
   $child_array = $root_array;
    $root_array = array();  
	
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
    $sql=mysql_query("SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1") or die("Fehler".mysql_error());
    $subnav_data = mysql_fetch_array($sql);
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content.php");
$sql=mysql_query("SELECT * FROM `content` WHERE `content_ID` = $page_id") or die("Fehler".mysql_error());

            $data = mysql_fetch_array($sql);
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
</div>
```

Es wird nachwie vor garnichts angezeigt.

Sieht denn niemand den Fehler darin

Grüße


----------



## Nord-Süd-Richtung (8. Januar 2009)

Hi

ich denke mal das menu_display ein Integerwert ist oder? Dann darfst du darum keine Anführungszeichen machen.

```
#vorher
$sql=mysql_query("[..]WHERE `menu_topid`=0 AND `menu_display` !='0'[..]") or die("Fehler".mysql_error()); 
#nachher
$sql=mysql_query("[..]WHERE `menu_topid`=0 AND `menu_display` != 0 [..]") or die("Fehler".mysql_error());
```

mfg Nord


----------



## dsNDesign (8. Januar 2009)

Hi,
ja, es hat ein Integer Wert. Die Änderung hat leider auch nichts gebracht.

http://designers-place.bplaced.net/cms/

Es wird einfach gar nichts angezeigt.

Stimmen die Einträge in der Datenbank so auch sicher, oder ist da doch schon was falsch?

http://img3.imagebanana.com/img/c09ogtv/menu.jpg
http://img3.imagebanana.com/img/gzof18b/content.jpg


----------



## Bernd1984 (8. Januar 2009)

Hallo dsNDesign,

wenn man sich den Sourcecode der Seite http://designers-place.bplaced.net/cms/ anschaut, wird nichts ausgegeben.


> <div id="navi">
> </div>
> <div id="content">
> </div>


Lass dir doch mal die SQL's ausgeben, einfach in die Seite schreiben.
Dann kannst du da ja vllt. schon einen Fehler erkennen, wenn es sich um einen SQL-Fehler handelt.


----------



## Nord-Süd-Richtung (8. Januar 2009)

Hi

hast du den Wert auch wirklich überall geändert?


----------



## dsNDesign (8. Januar 2009)

@Nord-Süd-Richtung

ich denke schon.
Hier mein Code:

```
<div id="navi">
<?php include_once("db_menu.php");
$sql=mysql_query("SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());
$nav_array = array();
$i = 0;
while ($nav_data = mysql_fetch_array($sql)) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    $i++;
}  
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  

$sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != 0 ORDER BY `menu_position`") or die("Fehler".mysql_error());
$i = 0;
while ($subnav_data = mysql_fetch_array($sql)) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
    $sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());

    //Die Tabelle auslesen
    while($subnav_data = mysql_fetch_array($sql)) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
		
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
	
   $child_array = $root_array;
    $root_array = array();  
	
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
    $sql=mysql_query("SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1") or die("Fehler".mysql_error());
    $subnav_data = mysql_fetch_array($sql);
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content.php");
$sql=mysql_query("SELECT * FROM `content` WHERE `content_ID` = $page_id") or die("Fehler".mysql_error());

            $data = mysql_fetch_array($sql);
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
</div>
```

@Bernd1984
Wie meinst du das?


----------



## Nord-Süd-Richtung (8. Januar 2009)

Hi

was Bernd meint tue ich auch immer, wenn es MySQL Fehler gibt:

```
<?php include_once("db_menu.php");
echo "SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC";
$sql=mysql_query("SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());
$nav_array = array();
$i = 0;
while ($nav_data = mysql_fetch_array($sql)) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    $i++;
}  
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
echo "SELECT * FROM `menu` WHERE `menu_ID` = $nav_id";
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  
echo "SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != 0 ORDER BY `menu_position`";
$sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != 0 ORDER BY `menu_position`") or die("Fehler".mysql_error());
$i = 0;
while ($subnav_data = mysql_fetch_array($sql)) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
echo "SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC";
    $sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC") or die("Fehler".mysql_error());

    //Die Tabelle auslesen
    while($subnav_data = mysql_fetch_array($sql)) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
        
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
    
   $child_array = $root_array;
    $root_array = array();  
    
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
echo "SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1";
    $sql=mysql_query("SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1") or die("Fehler".mysql_error());
    $subnav_data = mysql_fetch_array($sql);
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content.php");
echo "SELECT * FROM `content` WHERE `content_ID` = $page_id";
$sql=mysql_query("SELECT * FROM `content` WHERE `content_ID` = $page_id") or die("Fehler".mysql_error());

            $data = mysql_fetch_array($sql);
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
```

Kleine Anmerkung: Das ASC kannst du dir eigentlich sparen, weil das die Standardsortierweise ist


----------



## dsNDesign (8. Januar 2009)

Hi,

kommt folgendes raus: http://designers-place.bplaced.net/cms/index2.php


----------



## Bernd1984 (9. Januar 2009)

Hallo dsNDesign,

die SQL's sehen ok aus.


> SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC
> SELECT * FROM `menu` WHERE `menu_ID` = 1
> SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = 1 and `menu_display` != 0 ORDER BY `menu_position`
> SELECT * FROM `content` WHERE `content_ID` = 1


Du kannst die SQL's ja mal bei dir auf der Datenbank ausführen und schauen was für Ergebnisse dabei rauskommen.
Evtl. ist die Ergebnissliste leer.


----------



## dsNDesign (9. Januar 2009)

Also wenn ich das richtig verstanden habe, habe ich einfach mal folgendes gemacht:

SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC;

Als SQL Befehl ausgeführt. Es kam das raus:

```
SQL-Befehl:
SELECT `menu_ID` , `menu_name`
FROM `menu`
WHERE `menu_topid` =0
AND `menu_display` !=0
ORDER BY `menu_position` ASC
LIMIT 0 , 30;
```


SELECT * FROM `menu` WHERE `menu_ID` = $nav_id;
kommt:

```
Fehler

SQL-Befehl: Dokumentation

SELECT *
FROM `menu`
WHERE `menu_ID` = $nav_id
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1054 - Unknown column '$nav_id' in 'where clause'
```


SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != 0 ORDER BY `menu_position`;
kommt:

```
Fehler

SQL-Befehl: Dokumentation

SELECT `menu_ID` , `menu_topid` , `menu_name`
FROM `menu`
WHERE `menu_topid` = $nav_id
AND `menu_display` !=0
ORDER BY `menu_position`
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1054 - Unknown column '$nav_id' in 'where clause'
```


SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC;
kommt:

```
Fehler

SQL-Befehl: Dokumentation

SELECT `menu_ID` , `menu_topid` , `menu_name`
FROM `menu`
WHERE `menu_topid` = $next_topid
ORDER BY `menu_position` ASC
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1054 - Unknown column '$next_topid' in 'where clause'
```


SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1;
kommt:

```
Fehler

SQL-Befehl: Dokumentation

SELECT `menu_topid`
FROM `menu`
WHERE `menu_ID` = $next_topid
LIMIT 1

MySQL meldet: Dokumentation
#1054 - Unknown column '$next_topid' in 'where clause'
```


SELECT * FROM `content` WHERE `content_ID` = $page_id;
kommt:

```
Fehler

SQL-Befehl: Dokumentation

SELECT *
FROM `content`
WHERE `content_ID` = $page_id
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1054 - Unknown column '$page_id' in 'where clause'
```

Also ich vermute mal, da ist was falsch.

EDIT: Eigentlich kann ja MySql die Befehle wie $nav_id gar nicht kennen, da es ja nur in den PHP Dateien steht.


----------



## Bernd1984 (9. Januar 2009)

Hallo dsNDesign,

die SQL's die ich gepostet habe sind die, die du auf deiner Seite ausgegeben hast. Diese solltest du an der Console testen.

Du darft an der Console keine PHP-Variablen (z.B. $nav_id) benutzen, sondern das was du mit echo auf der Seite (SQL von der HTML-Seite kopieren) ausgibst.


----------



## Bernd1984 (9. Januar 2009)

Hallo dsNDesign,

der erste SQL


> SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC


 hat ja funktioniert, aber kein Ergebnis, also keine Daten in der Datenbank gefunden.


----------



## dsNDesign (9. Januar 2009)

Hi,
irgendwie verstehe ich das gerade nicht so ganz. Kann ich dir kurz die Login Daten zum MySql schicken, dass du es dir mal anschauen kannst?


----------



## Bernd1984 (9. Januar 2009)

Hi,

die SQL' s und Daten sehen gut aus.

Änder bitte mal den PHP-Code

```
while ($nav_data = mysql_fetch_array($sql)) { 
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]); 
    $i++; 
}
```
Statt die Daten ins Array zu schreiben, einfach mal ausgeben
	
	
	



```
while ($nav_data = mysql_fetch_array($sql)) { 
    echo $nav_data["menu_ID"];
    echo $nav_data["menu_name"]; 
    $i++; 
}
```
Hoffe der PHP-Code ist so Ok


----------



## dsNDesign (9. Januar 2009)

http://designers-place.bplaced.net/cms/

Sieht schonmal gar nicht so schlecht aus.


Hier mal noch der komplette Code:

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Designers Place | CMS</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="container">
<div id="head"></div>
<div id="navi">
<?php include_once("db_menu.php");
$sql=mysql_query("SELECT `menu_ID`, `menu_name` FROM `menu` WHERE `menu_topid`=0 AND `menu_display` != 0 ORDER BY `menu_position` ASC") or die("Fehler1".mysql_error());
$nav_array = array();
$i = 0;
while ($nav_data = mysql_fetch_array($sql)) { 
    echo $nav_data["menu_ID"];
    echo $nav_data["menu_name"]; 
    $i++; 
} 
$nav_id = (int) $_GET["nav_id"];
if ($nav_id <= 0) {
    $nav_id = $nav_array[0]['menu_ID'];
}  
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler2".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];  

$child_array = array();
$root_array = array();
//Die Stufe beginnt von unten zu zählen, statt von oben. Wird am Schluss umgerechnet
$invlevel = 1;  

$sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $nav_id and `menu_display` != 0 ORDER BY `menu_position`") or die("Fehler3".mysql_error());
$i = 0;
while ($subnav_data = mysql_fetch_array($sql)) {
    $child_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);
    $i++;
}  

//Die nächsthöhere TopID
$next_topid = $page_data["menu_topid"];
//Solange durchlaufen lassen bis obersten Navitationsteile erreicht sind (top_id == 0)
while (($next_topid != 0 || $next_topid != false))    {  

    if(empty($child_array[0]["menu_topid"])) {
        $top_id = $nav_id;
    } else {
        $top_id = $child_array[0]["menu_topid"];
    }  

  $invlevel++;
    $i = 0;  //Zähler in der Schlaufe
    $sql=mysql_query("SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = $next_topid ORDER BY `menu_position` ASC") or die("Fehler4".mysql_error());

    //Die Tabelle auslesen
    while($subnav_data = mysql_fetch_array($sql)) {

        $root_array[$i] = array('menu_ID'=>$subnav_data["menu_ID"], 'menu_name'=>$subnav_data["menu_name"], 'menu_topid'=>$subnav_data["menu_topid"], 'level'=>$invlevel);  
		
if($root_array[$i]["menu_ID"] == $top_id) {

            $root_array = array_merge($root_array, $child_array);
            //Minus 1, weil es sonst einen Zwischenraum gibt. Z.B. $root_array[2], dann $root_array[4]
            $i = count($root_array) - 1;
        }
        $i++;
    }  
	
   $child_array = $root_array;
    $root_array = array();  
	
   //Hier wird noch mit der alten $next_topid gerechnet. Die Topid vom höheren Menu wird gelesen
    $sql=mysql_query("SELECT `menu_topid` FROM `menu` WHERE `menu_ID` = $next_topid LIMIT 1") or die("Fehler5".mysql_error());
    $subnav_data = mysql_fetch_array($sql);
    //Neues $next_topid
    $next_topid = $subnav_data["menu_topid"];
}  

$anzlevel = $invlevel;

$invlevel = 0;
$number = count($child_array);

//Die Umrechnunsschleife, die Levels werden neu gesetzt: Das Höchste jetzt das Tiefste und umgekehrt
for($i = 0; $i < $number; $i++) {
    $invlevel = $child_array[$i]['level'];
    $child_array[$i]['level'] = $anzlevel - $invlevel + 1;
}

//Die Subnav_array mit dem vollständigen child_array füllen
$subnav_array = $child_array;  


?>
</div>
<div id="content">
<?php include_once("db_content.php");
$sql=mysql_query("SELECT * FROM `content` WHERE `content_ID` = $page_id") or die("Fehler6".mysql_error());

            $data = mysql_fetch_array($sql);
            $content_title = $data["content_title"];
            $content_text = $data["content_text"];

            if ($content_title == "" && $content_text == "") {
                $content_title = "JClub-Noch kein Inhalt";
                $content_text = "Keine Daten gefunden";
            }  
?>
</div>
</div>
</body>
</html>
```

Soll ich schon nur das eine array umändern oder soll ich *alle* arrays als echo ausgeben?

EDIT: Ich habe gerade mal die Fehler durchnummeriert. 
Die momentane Fehleranzeige bezieht sich auf Fehler2 also auf:

```
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler2".mysql_error());
```


----------



## Bernd1984 (9. Januar 2009)

Hallo dsNDesign,

die Ausgabe ist ja nur zum Test.

Du kann ja alle Daten mal ausgeben, aber das wird alles ok sein.

Ich fürchte du hast ein Problem mit deinem PHP-Code.

Aber da kenn ich mich nicht so aus.


----------



## Bernd1984 (9. Januar 2009)

Hallo, 



> EDIT: Ich habe gerade mal die Fehler durchnummeriert.
> Die momentane Fehleranzeige bezieht sich auf Fehler2 also auf:


das kann sein, da du das Array für SQL 1 nicht mehr füllst, das ist ein Folgefehler, da $nav_id einen ungültigen Wert enthält.
Bau deinen Code mal zurück.
Evtl. kannst du auch das echo zusätzlich dazuschreiben.


----------



## dsNDesign (9. Januar 2009)

wie genau meinst du das jetzt? also so:


```
while ($nav_data = mysql_fetch_array($sql)) {
    $nav_array[$i] = array('menu_ID'=>$nav_data["menu_ID"], 'menu_name'=>$nav_data["menu_name"]);
    echo $nav_data["menu_ID"];
    echo $nav_data["menu_name"]; 
    $i++;
}
```

Oder ganz weiter zurück?


----------



## Bernd1984 (9. Januar 2009)

Hallo,

ja, wenn der Code dann noch ohne Fehler funktioniert.


----------



## dsNDesign (9. Januar 2009)

Also Fehler wird keiner angezeigt. Aber die Navigation an sich, also als Link etc funktioniert nachwie vor nicht.

*EDIT: ich habe mal an den Anfang der Datei ein error_reporting(E_ALL); eingefügt. Jetzt kommt folgender Fehler: Notice: Undefined index: nav_id in /users/designers-place/www/cms/index.php on line 23

Line 23:*

```
$nav_id = (int) $_GET["nav_id"];
```

EDIT2:
Der Fehler mit der nav_id in line 23 hat ja wieder was mit dem Fehler von vorhin zu tun, als der array nur als echo ausgegeben wurde. 
Weil in line 27 kommt die nav_id ja wieder vor:

```
$sql=mysql_query("SELECT * FROM `menu` WHERE `menu_ID` = $nav_id") or die("Fehler2".mysql_error());
$page_data = mysql_fetch_array($sql);
$page_id = $page_data["menu_page"];
```


----------



## Bernd1984 (9. Januar 2009)

Hi, 

prüf nochmal die Daten für 


> SELECT `menu_ID`, `menu_topid`, `menu_name` FROM `menu` WHERE `menu_topid` = 1 and `menu_display` != 0 ORDER BY `menu_position`



Hier gibt es keine Daten.


----------



## dsNDesign (9. Januar 2009)

Hab den Befehl in SQL ausgeführt. Kommt folgendes raus:
http://img3.imagebanana.com/img/oe4sa85/Unbenannt.jpg

Aber ich denke, es hat was mit dem nav_id zu tun: Notice: Undefined index: nav_id in /users/designers-place/www/cms/index.php on line 23

line 23:

```
$nav_id = (int) $_GET["nav_id"];
```

(hab an den Anfang der Datei ein error_reporting(E_ALL); gemacht)


----------



## Bernd1984 (9. Januar 2009)

Hi,

ja, denke ich auch, das heisst aber das ist ein PHP-Problem.

Da kann ich dir leider nicht weiterhelfen.


----------



## dsNDesign (9. Januar 2009)

Ok. Danke schonmal soweit. Hast mir schon viel geholfen. Vielleicht findet sich ja jemand, der mir dann jetzt noch mit dem PHP Problem helfen kann.

*//edit*

Mir ist gerade etwas aufgefallen.

Ich habe ja nachwievor folgenden Fehler: Notice: Undefined index: nav_id in /users/designers-place/www/cms/index.php on line 21

Ich habe mir gerade nochmal das Tutorial durchgelesen und da ist mir folgende Zeile aufgefallen:
_"Jetzt habt ihr ein Array mit allen Inhalten für die Topnavigation. Diese müsst ihr je nach Templatesystem entweder noch aufbereiten, oder könnte es so an z.B. Smarty weitergeben.
Anschliessend muss geschaut werden, welche nav_id von der URL übergeben wurde.
Falls die ID kleiner oder gleich 0 ist, wird die ID des ersten Eintrages des oberen Arrays genommen, was in unserem Fall immer die Startseite ist."_

Was hat es mit diesem Smarty aufsich? Könnte es vllt daran liegen, dass es bei mir zu einem Fehler kommt?

Grüße


----------

