Breadcrumb Navi Problem

Starfox2007

Mitglied
Hi zusammen,

Ich Bastel gerade eine Breadcrumb Navigation auf Mysql gestützt und komme nicht weiter.

Die Mysql Struktur sieht so aus:

+-----+------+----------+
| id | link | parent |
+-----+------+----------+
| 1 | pets | 0 |
+-----+------+----------+
| 2 | cats | 1 |
+-----+------+----------+
| 3 | dogs | 1 |
+-----+------+----------+

In der Variable $page ist mein aktueller Seitenlink gespeichert z.b. pets und wird in der Url mit ?page=pets aufgerufen.

So und nun noch meine Funktion:

PHP:
function breadcrumbs($page) {
           
           $result = mysql_query("SELECT id, label, parent FROM hp_navigation WHERE link = '$page' ");
           $row = mysql_fetch_array($result);
        		
           
           $path = array();
        
           
           if ($row['parent']!= 0) {
               
               $path[] = $row['parent'];
        
               
               $path = array_merge(breadcrumbs($row['parent']), $path);
			   
           }
        
           
           return $path;
}


Die Navigation soll dann so aussehen:

Hauptseite > Pets
 
Ich hatte genau das mal in MySQL gelöst.
Hier nun mein Resultat
MySQL Hierarchie Baum auslesen

SQL:
SELECT
    id
FROM
    (
        SELECT  
                -- Die letzte ParentID als ID ausgeben
            @id AS id,
            -- Die nächste ParentID ermitteln
            @id := IF(@id IS NOT NULL, (SELECT parentID FROM nav WHERE id = @id), NULL) AS parentID
        FROM
            nav,
            -- Die Variablen initialisieren
            -- TODO: Hier anstelle der 9 deine Start-ID setzen
            (SELECT @id := 9) AS vars
        WHERE
            @id IS NOT NULL
    ) AS dat;
 
Das funktioniert ^^ echt der Hammer :D

Aber 2 kleine Probleme hab ich damit trotzdem noch:

Die Sortierung ist falsch herum, und ich bin noch nicht dahintergekommen wo das DESC hingehört ^^

Zum 2ten ist bei mir die erste ID immer 0 es wird also keine Hauptseite angezeigt weil die ja die ID 1 hat.

Hier mal die Datenbankstruktur und mein jetziger Code:

PHP:
$listpageId = $db->fetcharray($db->query("SELECT id FROM hp_navigation WHERE link = '$page'")); // Liest die passende ID zum Link aus der URL aus
  $pageId = $listpageId["id"];
  
  $sql= "SELECT id FROM (SELECT @id AS id, @id := IF(@id IS NOT NULL, (SELECT parent FROM hp_navigation WHERE id = @id), NULL) AS parent FROM hp_navigation, (SELECT @id := '$pageId') AS vars WHERE @id IS NOT NULL) AS dat;";
 $result = $db->query($sql);
while ($breadcrumb = $db->fetcharray($result))
{
	
		
	
	$navigation = $db->fetcharray($db->query("SELECT label FROM hp_navigation WHERE id = ".$breadcrumb["id"].""));
	echo $navigation["label"];
	
}

Jemand ne Idee ? bin leider immernoch nicht weiter :(

Also das Script von Jaslaw hat zwar funktioniert, aber nicht so wie ich es wollte.

Nach einigem hin und hersuchen im Internet bin ich jetzt auf dieses Script gestoßen, was auch so funktioniert wie ich es haben will.

Hauptseite > Unterseite1 > Unterseite2 usw....

jetzt mein Problem:

wie kann man diese Funktion umschreiben sodas ich sie nicht mit get_path(id); aufrufen muss sondern in den SELECT Query meine ID eintragen kann ?

PHP:
// $node is the name of the node we want the path of 
function get_path($node) { 
    // look up the parent of this node 
    $result = mysql_query('SELECT parent, label FROM hp_navigation WHERE id="'.$node.'"'); 
    $row = mysql_fetch_array($result); 
 
    // save the path in this array 
    $path = array(); 
 
    // only continue if this $node isn't the root node 
    // (that's the node with no parent) 
    if ($row['parent'] != "") { 
        // the last part of the path to $node, is the name 
        // of the parent of $node 
        $path[] = $row["parent"]; 

         // we should add the path to the parent of this node 
        // to the path 
        $path = array_merge(get_path($row["parent"]), $path); 
    } 
 
    // return the path 
    return $path; 
} 

print_r(get_path(8)); // Damit wird die Funktion aufgerufen
 

Anhänge

  • 1.jpg
    1.jpg
    74 KB · Aufrufe: 18
  • 2.jpg
    2.jpg
    70 KB · Aufrufe: 15
Zuletzt bearbeitet von einem Moderator:
Also ganz einfach ausgedrückt, wie bekomme ich jetzt das Ergebnis der Funktion in einen Mysql Query so das ich mit diesem dann die Beschreibung der Seiten ausgeben kann.

Ich hab schon rumprobiert mit:

PHP:
 $breadcrumb = get_path("$pageId"); 
// PageId entspricht der ID der gerade jetzt angezeigten Seite
$bread = implode(",", $breadcrumb);

$sql = "SELECT label FROM hp_navigation WHERE parent IN ($bread)";

Ich weiß nicht ob das der richtige Ansatz ist.
 
Zuletzt bearbeitet:
Wohl eher so:

PHP:
 $breadcrumb = get_path("$pageId"); 
// PageId entspricht der ID der gerade jetzt angezeigten Seite
// Wird nicht benötigt $bread = implode(",", $breadcrumb);


// Syntax lautet: "SELECT ..... WHERE parent IN (1, 2, 3, 4);"
$sql = "SELECT label FROM hp_navigation WHERE parent IN ($breadcrumb)";

Daher ist das explode nicht zielführend.


EDIT:

Wenn ich genau drüber nach denke, macht es wohl noch mehr Sinn, die ID vom Label abzufragen, statt das parent.
 
Also als alter Datenbankmensch würde ich mit 2 Tabelle arbeiten (Normalisierung).
Tabelle 1: Parents
ID - Bescheibung
1 - Pets
2 - Cars

Tabelle 2: Childs
ID - Beschreibung - ParentID (FK)
1 - cats - 1
2 - dogs - 1
3 - mustang - 2

Dann sollte das ganze einfacher sein, zumindest wenn Du nur 2 Ebenen hast.
 
@Saftmeister
Das hab ich schon probiert, wenn ich deinen Code nehme kommt die Fehlermeldung:
Unknown column 'Array' in 'where clause'

PHP:
$breadcrumb = get_path("$pageId");
$sql = "SELECT label FROM ".$sqltab25." WHERE parent IN ($breadcrumb)";

@Fragenfrager
Leider habe ich mehr als 2 Ebenen und genau das macht das ganze ja so komplex, ich hab jedesmal nen Knoten im Hirn wenn ich an der Breadcrumb Navi hänge :D
 
Achtung und ich hab es auch fast geschafft, hab mich eben nochmal dran gesetzt :)

Und zwar doch mit Yaslaw´s genialer Mysql Abfrage :D

Hier das Ergebnis:

PHP:
$sql= "SELECT id FROM (SELECT @id AS id, @id := IF(@id IS NOT NULL, (SELECT parent FROM ".$sqltab25." WHERE id = @id), NULL) AS parent FROM ".$sqltab25.", (SELECT @id := '$pageId') AS vars WHERE @id IS NOT NULL) AS dat";
$result = $db->query($sql);
while ($breadcrumb = $db->fetcharray($result))
{
	
	$breadid[] = $breadcrumb["id"];
    
}

// Ich speichere die Id´s im Array breadid die sind ja noch falsch herum ...
asort($breadid); // Ich sortiere das Array 

$breadid = implode(",", $breadid);

$sql = "SELECT id, label, link FROM ".$sqltab25." WHERE id IN ($breadid)";
$result = $db->query($sql);
while ($breadcrumb = $db->fetcharray($result))
{

if($breadcrumb["id"] == "1") {

echo "";	
	
}

echo "<a href='index.php?page=".$breadcrumb["link"]."'>".$breadcrumb["label"]."</a>&nbsp;<img src='./images/hpstyle/menue/arrow.gif' alt='' title='' />&nbsp;";

 }

So jetzt noch 2 Kleinigkeiten die fehlen aber ich wieder mal aufm Schlauch stehe...

Ich muss irgendwie mit Count hinbekommen das wenn der letzte Link angezeigt wird kein Arrow.Gif mehr angezeigt wird vll hat hier jemand nen Denkanstoss

2te Sach ich muss hinbekommen das ein Link Hauptseite immer dann angezeigt wird wenn wir nicht auf ID 1 sind vll auch mit Count ?
 
Zurück