2Danke
ERLEDIGT
JA
JA
ANTWORTEN
10
10
ZUGRIFFE
556
556
EMPFEHLEN
-
30.11.11 22:08 #1
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
-
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;
---------------------------------------------------------------------------------------------------
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
-
01.12.11 20:02 #3
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:
Jemand ne Idee ? bin leider immernoch nicht weiterPHP-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"];
}

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
Geändert von sheel (04.12.11 um 20:42 Uhr) Grund: Triplepost
-
04.12.11 20:44 #4
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.521
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
05.12.11 12:43 #5
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:
Ich weiß nicht ob das der richtige Ansatz ist.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)";
Geändert von Starfox2007 (05.12.11 um 12:48 Uhr)
-
05.12.11 20:48 #6
- 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 ;-)
-
06.12.11 13:04 #7
- 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.
-
06.12.11 15:08 #8
@Saftmeister
Das hab ich schon probiert, wenn ich deinen Code nehme kommt die Fehlermeldung:
Unknown column 'Array' in 'where clause'
@FragenfragerPHP-Code:$breadcrumb = get_path("$pageId");
$sql = "SELECT label FROM ".$sqltab25." WHERE parent IN ($breadcrumb)";
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
-
06.12.11 15:11 #9
- 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 ;-)
-
06.12.11 15:49 #10
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:
So jetzt noch 2 Kleinigkeiten die fehlen aber ich wieder mal aufm Schlauch stehe...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> <img src='./images/hpstyle/menue/arrow.gif' alt='' title='' /> ";
}
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 ?
-
07.12.11 22:11 #11
Hier das fertige Script falls es mal einer braucht
:
Viel Spaß damitPHP-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> <img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' /> ";
}else{
echo "<a href='index.php?page=news'>Hauptseite</a> <img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' /> <a href='index.php?page=".$breadcrumb["link"]."'>".$breadcrumb["label"]."</a> <img src='./images/hpstyle/menue/arrow.gif' style='vertical-align:middle;' alt='' title='' /> ";
}
}
$counter++;
}
Ähnliche Themen
-
[Typo3] Breadcrumb Menü zeigt immer nur aktuelle Seite an
Von Bionicman im Forum Content Management Systeme (CMS)Antworten: 2Letzter Beitrag: 13.02.10, 14:51 -
Problem mit Navi
Von Paulischroeder im Forum HTML & XHTMLAntworten: 3Letzter Beitrag: 25.07.07, 21:51 -
Prob mit Breadcrumb Nav
Von Headymaster im Forum PHPAntworten: 3Letzter Beitrag: 22.11.06, 11:23 -
problem mit navi
Von abanta im Forum CSSAntworten: 5Letzter Beitrag: 14.04.05, 15:42 -
Navi Problem
Von Hexle im Forum Flash PlattformAntworten: 4Letzter Beitrag: 16.07.04, 11:40





Zitieren



Login






[PHP][Snippet] Array zu XML konvertieren