hossi: function ausgabe funktioniert nicht

Nabend,

ich habe im Netz eine PHP Funktion gefunden, mit der man anhand einer MySQL DB eine Navigation hierarchisch aufbauen kann.

Die DB sieht in etwa so aus:

ID Name         parentID
1 Lebensmittel 0
2 Orangen 6
3 Broccoli 7
4 Herrenkleidung 10
5 Damenkleidung 10
6 Obst 1
7 Gemüse 1
8 Pfirsich 6
9 Kohlrabi 7
10 Kleidung 0
11 Getränke 1

anhand der parentID kann die Navigation hierarchisch aufgebaut werden.

hier die php funktion:

  function getMenu($oberkat) {  
    $einlesen = mysql_query("SELECT ID, name FROM navigation WHERE parentID='".$oberkat."' ORDER BY name");  
    $menu = "";  
    while($einzeln = @mysql_fetch_assoc($einlesen)) {  
      if(hasChildKats($einzeln['ID'])) {  
        $menu .= "<li>".$einzeln['name']."<ul>";  
        $menu .= getMenu($einzeln['ID']);  
        $menu .= "</ul></li>";  
      } else {  
        $menu .= "<li>".$einzeln['name']."</li>";  
      }  
    }  
    return $menu;  
  }  
  
  function hasChildKats($katID) {  
    $einlesen = mysql_query("SELECT ID FROM navigation WHERE parentID='".$katID."'");  
    if(mysql_num_rows($einlesen)>0) return true; else return false;  
  }

am Anfang habe ich natürlich noch den db-connect includet.

Bei mir gibt die Funktion aber nichts aus, warum?

LG

  1. Hallo,

    ich habe im Netz eine PHP Funktion gefunden, mit der man anhand einer MySQL DB eine Navigation hierarchisch aufbauen kann.
    [Codeauszug]
    am Anfang habe ich natürlich noch den db-connect includet.
    Bei mir gibt die Funktion aber nichts aus, warum?

    keine Ahnung - was hast du schon zur Fehlersuche unternommen? Wird die Funktion überhaupt aufgerufen? Wird der richtige HTML-Code erzeugt? Wird der Rückgabewert verwendet und ausgegeben?

    Und das hier:

    if(mysql_num_rows($einlesen)>0) return true; else return false;

    ist mir nur auf die Schnelle aufgefallen - das ist ja wirklich von hinten durch die Brust ins Knie. Das lässt sich kürzer und übersichtlicher schreiben:

    return (mysql_num_rows($einlesen)>0);

    So long,
     Martin

    --
    They say hard work never killed anyone, but I figure, why take the risk?
      (Ronald Reagan, US-Präsident 1981-1989)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,

      if(mysql_num_rows($einlesen)>0) return true; else return false;

      ist mir nur auf die Schnelle aufgefallen - das ist ja wirklich von hinten durch die Brust ins Knie. Das lässt sich kürzer und übersichtlicher schreiben:

      wie ich bereits erwähnte, ist es überhaupt keine gute Idee, sich Datensätze zurückgeben zu lassen, an denen man nicht interessiert ist, von denen man nur wissen will, ob die Anzahl größer ist als 0.

      return (mysql_num_rows($einlesen)>0);

      wenn schon, dann geht's noch kürzer:

      return mysql_num_rows($einlesen);

      Verlangt natürlich das Wissen, um die Konvertierungsregeln von int nach bool.
      Wie von mir angemerkt ist es viel sinnvoller, gleich die Anzahl der Datensätze abzufragen, oder gleich True oder False:

      SELECT  
          CASE  
              WHEN COUNT(*) > 0 THEN 1   -- True ist in MySQL ein Alias für 1  
              ELSE 0                     -- False ist ein Alias für 0  
          END hasChildren  
      FROM  
          navigation  
      WHERE  
          parent_id = Vergleichswert  
      -- es gibt SQL-Dialekte, die mit True und False nichts anfangen können :-)  
      
      

      Wie dem bereits verlinkten Kontextwechselartikel zu entnehmen ist, wäre hier intval() eine kontextgerechte Behandlungsmethode in PHP für den Vergleichswert.

      Freundliche Grüße

      Vinzenz

      1. Hi!

        Wie von mir angemerkt ist es viel sinnvoller, gleich die Anzahl der Datensätze abzufragen, oder gleich True oder False:
            CASE
                WHEN COUNT(*) > 0 THEN 1   -- True ist in MySQL ein Alias für 1
                ELSE 0                     -- False ist ein Alias für 0
            END hasChildren

        Das geht noch einfacher: SIGN(COUNT(*)) AS hasChildren

        SIGN() liefert von einem Wert das Vorzeichen als -1, 0 oder 1. Negative Werte können bei einem COUNT() nicht auftreten, weswegen -1 nicht vorkommt. 0 liefert 0 und der Rest liefert 1. Aber selbst das SIGN() kann man sich schenken, denn wenn man das Abfrageergebnis 0 und "Wert größer 0" nach boolean castet oder einfach boolesch auswertet, bekommt man schon das gewünschte Ergebnis.

        Lo!

  2. Hallo,

    ich habe im Netz eine PHP Funktion gefunden, mit der man anhand einer MySQL DB eine Navigation hierarchisch aufbauen kann.

    besonders schön ist sie nicht, dafür ressourcenfressend, fehlerbehaftet und glänzt vor allem durch Fehlen der Fehlerbehandlung.

    hier die php funktion:

    function getMenu($oberkat) {

    $einlesen = mysql_query("SELECT ID, name FROM navigation WHERE parentID='".$oberkat."' ORDER BY name");

    [link:http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel@title=Kontextwechsel] nicht beachtet.

    Fehlerbehandlung fehlt

    $menu = "";
        while($einzeln = @mysql_fetch_assoc($einlesen)) {

    oh yeah. Wir unterdrücken die Fehlermeldungen

    dafür verzichten wir auf eine Fehlerbehandlung

    if(hasChildKats($einzeln['ID'])) {

    setzen in einer Schleife SQL-Statements ab

    $menu .= "<li>".$einzeln['name']."<ul>";
            $menu .= getMenu($einzeln['ID']);

    und das ganze zu allem Überfluss auch noch rekursiv :-(

    $menu .= "</ul></li>";
          } else {
            $menu .= "<li>".$einzeln['name']."</li>";
          }
        }
        return $menu;
      }

    function hasChildKats($katID) {
        $einlesen = mysql_query("SELECT ID FROM navigation WHERE parentID='".$katID."'");

    Kontextwechsel nicht beachtet.

    if(mysql_num_rows($einlesen)>0) return true; else return false;

    Wenn ich nur eine Zahl benötige, dann frage ich genau diese mit COUNT() ab

    erhalte genau einen Datensatz mit genau einem Wert, den ich benötige.

    Fehlerbehandlung fehlt schon wieder.

    else ist überflüssig

    Codeformatierung lässt zu wünschen übrig.

    }

      
    
    > Bei mir gibt die Funktion aber nichts aus, warum?  
      
    weil ein Fehler auftritt.  
    Am besten entsorgst Du diesen Schrott ersatzlos.  
    Navigationen ändern sich nicht allzu häufig. Infolgedessen empfehle ich Dir das [Nested-Set-Muster](http://de.wikipedia.org/wiki/Nested_set) für die Umsetzung hierarchischer Strukturen in einer relationalen Datenbank.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Am besten entsorgst Du diesen Schrott ersatzlos.
      Navigationen ändern sich nicht allzu häufig. Infolgedessen empfehle ich Dir das Nested-Set-Muster für die Umsetzung hierarchischer Strukturen in einer relationalen Datenbank.

      Danke so weit mal, werd mal nach den Nested Sets googlen :)

      1. Hallo,

        Am besten entsorgst Du diesen Schrott ersatzlos.
        Navigationen ändern sich nicht allzu häufig. Infolgedessen empfehle ich Dir das Nested-Set-Muster für die Umsetzung hierarchischer Strukturen in einer relationalen Datenbank.

        Danke so weit mal, werd mal nach den Nested Sets googlen :)

        a) Warum verlinke ich Dir einen guten Einstiegspunkt zum einlesen?
        b) ist die hiesige Suchfunktion besser als Google :-)

        Freundliche Grüße

        Vinzenz

    2. Hi!

      Navigationen ändern sich nicht allzu häufig. Infolgedessen empfehle ich Dir das Nested-Set-Muster für die Umsetzung hierarchischer Strukturen in einer relationalen Datenbank.

      Nested Sets würde ich hier nicht einsetzen wollen. Sie eignen sich hervorragend, wenn man vielfältige Abfragen nach Teilmengen eines Baumes absetzen will. Für eine Navigation, bei der in der Regel immer nur alle Elemente angezeigt werden, reicht auch eine Auflistung mit Parent-Verweis.

      Lo!

  3. Hallo,

    ich habe dein Quellcode nicht auf die Richtigkeit geprüft aber davon abgesehen hast du vielleicht die echo bzw. print Anweisung vergessen?

    Also:

    z.B.

    $string = getMenu($oberkat);

    echo $string;

    Gruß

    Nerdi