php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.01.2009, 22:05  
Benutzer
 
Registriert seit: 05.11.2008
Beiträge: 35
Dunkelord befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Hierarchische Navigation

Servus,

ich arbeite jetzt schon seit Tagen an einer Navigation für meine Internetseite. Diese soll beliebig tief verschachtelbar sein.

Nun ja, nach tausend neuen Ansätzen habe ich endlich herausgefunden, warum plötzlich die Navigation aufhört.

Also, die beiden entscheidenden Spalten in der Navigationsstruktur in der Datenbank sind folgende:

ID: Id des Navigationspunktes
Ebene: ID des Elternpunktes
Reihenfolge: je niedriger die Zahl, desto weiter oben der Eintrag

Naja, Problem ist eben dieses: ich suche eine Möglichkeit, die Navigation bereits aus der Datenbank so zu sortieren, dass ich die Ausgabe in einer einzigen Schleife erledigen kann.

Sortiert soll so: (Ebene 0 bedeutet, dass es keinen übergeordneten Punkt mehr gibt)

Zitat:
ID | Ebene | Reihenfolge
1 | 0 | 1
2 | 1 | 2
4 | 1 | 3
3 | 0 | 4
Ergebiebt dann:
  • 1
    • 2
    • 4
  • 3

Unsortiert liegen diese Daten aber so vor:

Zitat:
ID | Ebene | Reihenfolge
1 | 0 | 1
2 | 1 | 2
3 | 0 | 4
4 | 1 | 3
Ich bin jetzt irgendwie mit meinem Latein am Ende. Ich bräuchte ein SQL-Query, welches zuerst nach der Ebene sortiert, danach nach der Reihenfolge, ohne dabei die vorherige Sortierung zu verändern. Also eben so, wie oben (ist leider recht schwer beschreibbar und warscheinlich liegt mir die Lösung schon in den Fingerspitzen und ich merk das bloß nicht).

Wäre wirklich dankbar, wenn ihr mir da helfen könntet. Notfalls verwende ich auch verschachtelte Schleifen (was ich aber eigentlich vermeiden will).

GreeetZ
Dunkelord ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.01.2009, 22:08  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Argh hab was falsches geschrieben.

Aber mit sortierung hat die Spalte "Ebene" nicht viel zutun! Das ist ja keine Sortierung sondern eine ganz andere Reihenfolge.
Flor1an ist offline   Mit Zitat antworten
Alt 10.01.2009, 23:25  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo,

beim ParentID- oder Hirarchie-Prinzip hilft nur Rekursion. Innerhalb einer Ebene kannst du dann ohne Probleme ein ORDER BY Reihenfolge einbauen, wenn du die aktuellen Knoten lädst.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 11.01.2009, 00:26  
Benutzer
 
Registriert seit: 05.11.2008
Beiträge: 35
Dunkelord befindet sich auf einem aufstrebenden Ast
Standard

Also, dr.e, dein Tipp mit rekursiver Programmierung bringt mich auch schon auf eine Idee. Bisher happert es nur ein wenig an der Umsetzung.

Ich habe es ja schon vorher geschafft, eine beliebig verschachtelbare Navigation zu erzeugen. Diese hatte nur einen Nachteil: unter den ersten Menüpunkt habe ich einen Unterpunkt einsortiert, der in der Datenbank den letzten Datensatz darstellt. Ich habe einfach drei Arrays genommen (Ebenen, Unterpunkte in den Ebenen und bereits angezeigte Unterpunkte in Ebene) und bei jedem Datensatz geprueft, ob der Wert in der Spalte Ebene dem in $ebene[0] entspricht. Hat sich ein neuer Knoten eröffnet, habe ich einfach mit array_unshift die neue ID an den Anfang von $ebenen gesetzt, beim Schließen habe ich das Array gekippt, den damit letzten Eintrag per array_pop entfernt und das array wieder umgedreht. Dadurch war $ebenen[0] nun das, was zuvor $ebenen[1] war.

Soweit so gut, aber dann kam er am Ende der Datensätze an und damit war Schluss. Gab ja keine Datensätze mehr.

An diesem Ansatz habe ich aber festgehalten. Ich habe es etwas anders gemacht: ich habe mir die IDs der Navipunkte in der ersten Ebene in ein Array gespeichert, danach eine for-Schleife mit $i=0; $i <= $a; $i++ (wobei $a count ($punkte)-1 entspricht). Dann habe ich Punkt für Punkt ein neues Query ausgeführt, welches den Menüpunkt ermittelt. War dieser in der gleichen Ebene, habe ich ihn mit unset aus dem $punkte-Array entfernt. Nachdem er dann beim letzten Datensatz angekommen war, habe ich $i wieder auf 0 gesetzt, die Anzahl der verbleibenden IDs in die Variable $a geschrieben und das Array mit den IDs neu geschrieben (damit die Schlüssel wieder 0,1,2,3,... und nicht 0,1,3,4,... sind). Dummerweise ist er nicht mehr in die vorherige Ebene gesprungen und dadurch ist eine Endlosschleife entstanden.

Wäre es möglich, dass ich diesen Ansatz weiter verfolge? Zwar ist diese Technik nicht gerade die profesionellste, aber da das nur ein kleines Projekt für mich ist, macht das wohl nicht viel aus und solange es funktioniert, soll es ruhig so sein. Es geht nur um etwas mehr als 30 Menüpunkte.

Danke für alle bisherigen Antworten
Dunkelord ist offline   Mit Zitat antworten
Alt 11.01.2009, 01:29  
Benutzer
 
Registriert seit: 05.11.2008
Beiträge: 35
Dunkelord befindet sich auf einem aufstrebenden Ast
Standard

Ok, der Tipp von dr.e war mir jetzt nicht nur eine große Hilfe - er war sogar die Lösung meines Problems

Ich habe mir mehrere Methoden in meine Klasse geschrieben. So läuft das ganze jetzt ab:

Die Hauptmethode Navigation () ermittelt alle Einträge auf der ersten Ebene. Danach ermittelt es zu jedem Eintrag alle Untereinträge durch die Funktion Unterpunkte (). Diese legt ein Array mit den IDs der Einträge an und ruft sich selber auf, falls dieser Punkt selber noch Untereinträge hat. Dieses Array wird in einer weiteren rekursiven Funktion UnterpunkteAnzeigen () verarbeitet.

Jetzt funktioniert es endlich! Und ich habe mich so oft darüber aufgeregt, dass es nicht funktioniert. Nur dieses eine Wort namens Rekursion hat mir gefehlt. Also nochmal vielen vielen Dank nach München an dr.e

Hoffentlich funktioniert das jetzt auch wirklich. Nicht dass da jetzt Fälle sind, in denen es zu Problemen kommt. Wobei ich den Fall "Eintrag ID 1 enthält ID 32" gleich mal ausprobiert habe. Daran ist es ja bisher immer gescheitert.

Jetzt muss ich nur noch meinen Navigationseditor so erweitern, dass ich den Baum editieren kann. Bisher habe ich das nur mit PMA gemacht^^
Dunkelord ist offline   Mit Zitat antworten
Alt 12.01.2009, 18:31  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Und auf zirkuläre Angaben achten!
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Navigation mit Active-Link Rezeptfrei PHP Tipps 2008 5 26.11.2008 13:45
Problem mit PHP Navigation hagene PHP Tipps 2008 4 09.10.2008 23:33
Kontaktformular mit Spamschutz und include Navigation? chicco4u PHP Tipps 2008 1 11.08.2008 09:52
Navigation fixen Desert PHP Tipps 2008 0 12.05.2008 17:00
Probs mit Layout für Navigation mit Grafiken/Hintergrund HTML, Usability und Barrierefreiheit 3 08.02.2006 19:56
Navigation snatch-ic PHP Tipps 2007 4 08.01.2006 12:11
Navigation PHP Tipps 2007 17 04.11.2005 20:07
Änderung der datenbank gestützten Navigation PHP Tipps 2005-2 1 26.09.2005 20:34
Probleme mit der Navigation Pimbolie1979 HTML, Usability und Barrierefreiheit 3 19.05.2005 15:45
Navigation mittels PHP anpassen PHP Tipps 2005 8 27.04.2005 14:35
Navigation PHP Tipps 2005 18 11.04.2005 16:16
Navigation tikal PHP Tipps 2004-2 3 03.12.2004 15:28
div layer navigation HTML, Usability und Barrierefreiheit 1 18.11.2004 15:44
Mit Templates Navigation erstellen? (welches Templatesyste?) zwelch PHP Tipps 2004-2 5 18.11.2004 15:14
schnieke navigation PHP Tipps 2004 8 26.10.2004 16:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
hierarchische navigation, php hierarchische navigation, html hierarchische navigation, hierarchische navigationsstruktur, navigation php reihenfolge, hierarchische menüs datenbank, php navigation 4 ebenen, http://www.php.de/datenbanken/50571-erledigt-hierarchische-navigation.html, hierarchisches menü php, order navigation php.de, layered navigation unset, reihenfolge navigation datenbank, php hierarchischer navigationsbaum, sortierung html hierarchie, hierarchische navigation html, was heißt hierarchischen navigationsmenü, hierarchische navigation php, php array rekursiv in navi einbauen, php rekursive navigation, html hierarchische

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum