Rekursive Baum-Traversierung mit mysql über PHP
Erstelle ich einen Fragebogen für einen Kunden, das erfordert, dass die Fragen, die organisiert werden durch 3 Lagen von Ebenen. Ich habe erfolgreich die U. I. aber ich habe versucht, für die letzten 3 Stunden ziehen Daten aus einer Datenbank in einer Weise, dass alles, was Belastungen an der richtigen Stelle. Die Datenbank organisiert ist wie so von dem client, so ich haben keine Kontrolle über Sie:
id description parentId
1 Level 1 0
2 Level 2 0
3 Level 1a 1
4 Level 1b 1
5 Level 1a1 3
Ich habe eine ähnliche Frage, die mir auf der Website, aber als ich versuchte, es ' s Lösung habe ich die folgenden auf wiederholen infinetly:
Code:
function makeList($par_id = 0) {
//your sql code here
$result = mysql_query("SELECT * FROM pB_test WHERE parentId = $par_id");
$pages = mysql_fetch_array( $result );
if (count($pages)) {
echo '<ul>';
foreach ($pages as $page) {
echo '<li>', $page['description'];
makeList($page['parentId']);
echo '</li>';
}
echo '</ul>';
}
}
makeList();
Ausgabe:
1
3
5
5
l
l
3
5
5
l
l
3
5
5
l
l
3
5
5
l
l
Weiß jemand wie man das beheben kann und was das Problem genau ist? Cheers
MySQL unterstützt keine rekursiven
JOIN
s, das ist, was Sie wirklich brauchen, aber wenn Sie wissen, Sie haben nur drei Ebenen und wird immer nur drei Ebenen, können Sie auch einfach left join der Tabelle auf sich selbst drei malInformationsquelleAutor Keiran Lovett | 2012-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tun recursivly:
Ok, wie würde ich dann organisieren Sie die Daten in divs so sagen level1 wurde ein container für alle seine Kinder und es war ein weiterer div-container innerhalb von. Dann level2 war der nächste container unten in der Liste?
Du musst Fragen, eine seperate Frage: ich bin ein PHP/SQL Kerl, nicht eine HTML-Kerl, tut mir Leid
Auch sollte es immer noch geltendes Recht? Wie kann ich es aufteilen, so dass jede Ebene nest, es ist ein eigenes html-markup? Wenn Sie nicht tun können, das ist in Ordnung. Danke für die Hilfe aber!
Im Grunde beginnen aus meinen code:, Wo ich echo
<ul>
sollten Sie das echo Ihrer Start-HTML</ul>
wird Ihre Endung HTML. Die Linie<li> ... </li>
Ihre Frage. Also ich vermute, es sollte etwas sein wie der Beginn<div class="..">
endet</div>
und Ihre formatierte Frage in der Mitte.InformationsquelleAutor Eugen Rieck
es ist nicht gut zu nennen, mysql-server und Ergebnis abrufen jedes mal
was ist, wenn Sie über 100 Zeilen? oder 200+
verwenden Sie diese Abfrage nur einmal:
typisches Beispiel für Tabelle
global $arrs;
(statt übergeben Sie es als parameter) in der Funktion. Es werden keine black box mehr, aber Sie verwenden viel weniger Speicher. Auch benutze mysqli anstatt mysql. Ohnehin mag ich es.Dies wird immer Holen Sie die vollständigen Tabelle, der möglicherweise mit Terabyte-RAM - keine Möglichkeit zu Holen ein Teilbaum,
fügen Sie einfach
WHERE parent_id=$parent_id
- Klausel Ihrer Abfrage, und 2. param zubuild_tree($arrs, $parent_id)
nennen. Es ist offensichtlich, dass es nicht geeignet für große Datenmengen, aber Sie wickeln TB die Ergebnisse in<ul><li>
als OP will?Genau. Ich würde nie die wrap-Terabyte in
<ul><li>
, aber ich würde Terabyte in eine DB. Dieser defekt-code wird immer abrufen aller Zeilen, also die Antwort aufwhat if you have over 100 rows? or 200+
ist einfach: Definitiv nicht, es wird brechen schrecklich auf, jede größere Baum.Danke @vladkras, bei weitem ist dies die beste Lösung, die ich gefunden habe
InformationsquelleAutor vladkras