function ausgabe funktioniert nicht
hossi
- php
0 Der Martin0 Vinzenz Mai0 dedlfix
0 Vinzenz Mai0 Nerdi
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
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
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
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!
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");
$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;
}
> 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
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 :)
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
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!
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