tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 2 Beitrag von Yaslaw
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
556
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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-Code:
    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
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ich hatte genau das mal in MySQL gelöst.
    Hier nun mein Resultat
    [MySQL] Hierarchie Baum auslesen

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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;
    aGeNET und Starfox2007 bedanken sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Das funktioniert echt der Hammer

    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-Code:
    $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-Code:
    // $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 
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Breadcrumb Navi Problem-1.jpg   Breadcrumb Navi Problem-2.jpg  

    Geändert von sheel (04.12.11 um 20:42 Uhr) Grund: Triplepost
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Zitat Zitat von Starfox2007 Beitrag anzeigen
    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 ?
    Verstehe die Frage nicht. Genau das macht die Funktion doch. Auf was willst du denn hinaus? Wie soll der Code denn aussehen?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    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-Code:
     $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.
    Geändert von Starfox2007 (05.12.11 um 12:48 Uhr)
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Wohl eher so:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    
     $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.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    Fragenfrager Fragenfrager ist offline Mitglied Bronze
    Registriert seit
    Apr 2007
    Beiträge
    46
    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.
     

  8. #8
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    @Saftmeister
    Das hab ich schon probiert, wenn ich deinen Code nehme kommt die Fehlermeldung:
    Unknown column 'Array' in 'where clause'

    PHP-Code:
    $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
     

  9. #9
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    EDIT: War totaler Mist! Ich hab mich verlesen. Dein Code war in Ordnung.
    Geändert von saftmeister (06.12.11 um 15:12 Uhr) Grund: Richtigstellung
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  10. #10
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Achtung und ich hab es auch fast geschafft, hab mich eben nochmal dran gesetzt

    Und zwar doch mit Yaslaw´s genialer Mysql Abfrage

    Hier das Ergebnis:

    PHP-Code:
    $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 ?
     

  11. #11
    Avatar von Starfox2007
    Starfox2007 Starfox2007 ist offline Mitglied Silber
    Registriert seit
    Apr 2010
    Beiträge
    87
    Hier das fertige Script falls es mal einer braucht :

    PHP-Code:
    $sql"SELECT id FROM (SELECT @id AS id, @id := IF(@id IS NOT NULL, (SELECT parent FROM tabelle WHERE id = @id), NULL) AS parent FROM tabelle, (SELECT @id := '$pageId') AS vars WHERE @id IS NOT NULL) AS dat";
    $result mysql_query($sql);
    while (
    $breadcrumb mysql_fetch_array($result))
    {
        
        
    $breadid[] = $breadcrumb["id"];
        
    }

    asort($breadid);

    $breadid implode(","$breadid);

    $counter 1;

    $sql2 "SELECT id, label, link FROM tabelle WHERE id IN ($breadid)";
    $result2 mysql_query($sql2);
    $num_rows mysql_num_rows($result2);
    while (
    $breadcrumb mysql_fetch_array($result2))
    {

    if(
    $breadcrumb["id"] == "1") { // Wenn Hauptseite soll nichts weiter angezeigt werden.

    echo "";    
        
    }

    if(
    $counter == $num_rows) {
        
    echo 
    "<a href='index.php?page=".$breadcrumb["link"]."'>".$breadcrumb["label"]."</a>";

    }else{

    if(
    $counter 1) {
    echo 
    "<a href='index.php?page=".$breadcrumb["link"]."'>".$breadcrumb["label"]."</a>&nbsp;<img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' />&nbsp;";
    }else{
    echo 
    "<a href='index.php?page=news'>Hauptseite</a>&nbsp;<img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' />&nbsp;<a href='index.php?page=".$breadcrumb["link"]."'>".$breadcrumb["label"]."</a>&nbsp;<img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' />&nbsp;";    
    }
        
    }

    $counter++;

     } 
    Viel Spaß damit
     

Ähnliche Themen

  1. [Typo3] Breadcrumb Menü zeigt immer nur aktuelle Seite an
    Von Bionicman im Forum Content Management Systeme (CMS)
    Antworten: 2
    Letzter Beitrag: 13.02.10, 14:51
  2. Problem mit Navi
    Von Paulischroeder im Forum HTML & XHTML
    Antworten: 3
    Letzter Beitrag: 25.07.07, 21:51
  3. Prob mit Breadcrumb Nav
    Von Headymaster im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.11.06, 11:23
  4. problem mit navi
    Von abanta im Forum CSS
    Antworten: 5
    Letzter Beitrag: 14.04.05, 15:42
  5. Navi Problem
    Von Hexle im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 16.07.04, 11:40