Untermenüs

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Untermenüs

    Hallo Leute,

    ich habe eine naviTabelle mit folgender Struktur

    id | parentID | text | link


    Ich möchte nun eine 4-Ebenen Navigation erstellen. parentID enthält immer die ID des Haupteintrages. Wie schreibe ich am besten eine Funktion, so dass alle Ebenen abgerufen werden?!?

    Bsp.:

    1 | 0 | Haupteintrag | abc.htm
    2 | 1 | Unter 1 | abc2.htm
    3 | 2 | Unter 2 | abc3.htm
    4 | 0 | Neuer Haupt | abcd4.htm

    Ciao
    Henning

  • #2
    Vorsicht! ich habe geschrieben ohne zu testen
    PHP-Code:
    //conect mit db

    function recursivmenu($oberkatigory){
      
    $sql="select * from naviTabelle where parentID=$oberkatigory order by id";
      
    $handle=mysql_query($sql) or die(mysql_error());
      if(!
    mysq_num_rows($handle)) return;
      echo
    "<ul>  ";
        while(
    $erg=mysql_fetch_array($handle)){
          echo
    "<li>";
          echo 
    implode("|",$erg);
          
    recursivmenu($erg['id']);
          echo
    "</li>";
        }
      echo
    "</ul>  ";
    }

    recursivmenu(0); 
    Slava
    bituniverse.com

    Kommentar


    • #3
      Original geschrieben von Slava
      PHP-Code:
      echo"</li>"
      jetzt wird sogar schon an solchen Stellen an Leerzeichen gespart? Oo,

      such mal nach "nested set", rekursive Querys zu basteln ist nicht gerade performant

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Original geschrieben von ghostgambler
        jetzt wird sogar schon an solchen Stellen an Leerzeichen gespart? Oo,

        such mal nach "nested set", rekursive Querys zu basteln ist nicht gerade performant
        sorry! für vergessene Lehrzeihen.
        kann sein, dass da auch ein paar fehler stecken, da ich es nicht getestet habe.
        Nested set ist auch eine Interesante und performance bessere Lösung.
        Ich habe mich aber auf schon vorhandene Tabellenstruktur konzentriert.
        Da es sich um ein Menü handelt, die sich nicht so oft ändert, würde ich in jedem fall cachen von den abfrageergebnis in eine Datei vorschlagen.
        und nur bei Änderung von Menüstruktur, abfrage wieder durchzuführen um der Ergebnis wieder bis den neuer Änderung in cache(datei) abspeichern.
        Slava
        bituniverse.com

        Kommentar


        • #5
          Wenn du bei der ParentId Struktur bleiben willst (kein NestedSet), ist es auch schneller einfach alle Einträge auf einmal aus der DB zu holen, und die struktur erst in PHP aufzubauen.

          Kommentar


          • #6
            Original geschrieben von Slava
            Da es sich um ein Menü handelt, die sich nicht so oft ändert, würde ich in jedem fall cachen von den abfrageergebnis in eine Datei vorschlagen.
            das erscheint mir auch spontan am besten

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Original geschrieben von phoboslab
              Wenn du bei der ParentId Struktur bleiben willst (kein NestedSet), ist es auch schneller einfach alle Einträge auf einmal aus der DB zu holen, und die struktur erst in PHP aufzubauen.
              Ich bitte um die kurze Erklärung von dieser Aussage.
              Slava
              bituniverse.com

              Kommentar


              • #8
                Naja, einfach ein "SELECT * FROM naviTabelle", alles in ein Array laden und in PHP den Baum aufbauen.
                Statt rekursiv anfragen an die DB zu senden, wird halt rekursiv in dem Array geschaut, ob es Kinder gibt.

                Kommentar


                • #9
                  Original geschrieben von phoboslab
                  Naja, einfach ein "SELECT * FROM naviTabelle", alles in ein Array laden und in PHP den Baum aufbauen.
                  Statt rekursiv anfragen an die DB zu senden, wird halt rekursiv in dem Array geschaut, ob es Kinder gibt.
                  das ist dass selbe wenn ich jetzt behaupte, dass
                  ------------------------
                  PHP-Code:
                  $a="hallo";
                  echo 
                  $a
                  ---------------------
                  von performance besser als
                  -----------------
                  PHP-Code:
                  echo "halo"
                  ----------------
                  ist.
                  in jedem Fall würde ich mich freuen wenn du es beweisen kannst, dass es schneller geht.
                  versuch einfach auf deine weise gleiche Ausgabe erzeugen und vergleiche das mit microtime() mit meinem beispiel.
                  vielleicht irre ich mich sogar(mit grossen Zweifel) .
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    Original geschrieben von Slava
                    versuch einfach auf deine weise gleiche Ausgabe erzeugen und vergleiche das mit microtime() mit meinem beispiel.
                    vielleicht irre ich mich sogar(mit grossen Zweifel) .
                    Hängt von zuvielen Faktoren ab, als dass man das verallgemeinern könnte. Wenn der DB-Server ein globaler für die komplette Werbfarm ist, ist Slavas Möglichkeit mit Sicherheit langsamer, wenn alle Anwendungen kaum SQL-Queries absetzen, statt dessen viele HTML-Seiten ausliefern ist Slavas Möglichkeit schneller ... alles in allem sind aber beide scheiße

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      Original geschrieben von ghostgambler
                      alles in allem sind aber beide scheiße
                      Danke für die Kritik!
                      4-fache self join oder nestedset?
                      Slava
                      bituniverse.com

                      Kommentar


                      • #12
                        Original geschrieben von ghostgambler
                        Wenn der DB-Server ein globaler für die komplette Werbfarm ist, ist Slavas Möglichkeit mit Sicherheit langsamer, wenn alle Anwendungen kaum SQL-Queries absetzen, statt dessen viele HTML-Seiten ausliefern ist Slavas Möglichkeit schneller
                        Ich behaupte mal meine möglichkeit ist in jedem fall schneller. Ein Query an die Datenbank abzusetzen dauert nunmal erheblich länger als ein lookup in einem Array. Klar, Messbar wird der Unterschied wohl erst, wenn der Baum eine gewisse größe erreicht hat.

                        Original geschrieben von ghostgambler
                        ... alles in allem sind aber beide scheiße
                        Nein, wieso? Wenn in der Tabelle tatsächlich nur das Menü steht, und sowieso immer alle Knoten geladen werden müssen(!), sehe ich kein Grund ein Nested Set einzusetzen (welches ja erheblich schwieriger Wartbar und potentiell Fehleranfälliger ist).

                        Kommentar


                        • #13
                          Für statische Sachen (z.B. Menü) bietet sich einfach die Zwischenspeicherung in einer Datei viel besser an, als jedes Mal für jeden User alles neu zu kreieren.
                          Und ansonsten würde ich auf nested set zurückgreifen, einfach aus dem Grund weil es da fertige Lösungen zu gibt (die einwandfrei funktionieren) und man nicht mit php (ggf. noch Rekursion mit drin) rumeiern muss, sondern mit einem Query den kompletten Baum bekommt

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            du böse ghostgambler
                            die fertige Losungen sind wenigstens 500 zeilen gross.
                            aber wenn du mir ein Link sendest zu einer fertiger Lösung mit der du persönlich schon gute Erfahrungen gesammelt hast, würde ich dir sehr dankbar
                            Slava
                            bituniverse.com

                            Kommentar


                            • #15
                              Original geschrieben von ghostgambler
                              Für statische Sachen (z.B. Menü) bietet sich einfach die Zwischenspeicherung in einer Datei viel besser an, als jedes Mal für jeden User alles neu zu kreieren.
                              Das Cachen immer schneller ist als irgendetwas dynamisch Aufzubauen, ist klar - darüber brauchen wir uns nich streiten. Aber wer hat denn gesagt, dass sein Menü "statisch" ist?

                              Den fertigen Nested Set Lösungen für PHP die ich kenne (genau 2 an der Zahl) fehlte übrigens eine Funktion zum verschieben von Teilbäumen. Ohne diese kommt man in vielen Situationen nicht drum herum, Teile des Baums zu löschen und an anderer Stelle wieder aufzubauen. Im endeffekt habe ich mir also wieder eine eigene Nested Set Klasse schreiben müssen - womit das Argument, dass es fertige Lösungen gibt, entkräftet wäre :X

                              Hab ich jetzt gewonnen?

                              Kommentar

                              Lädt...
                              X