Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Generowanie wielopoziomowego menu
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
mam taką bazę danych:http://www.rks.net.pl/bazaa.txt
chciałbym w możliwie najwydajniejszy sposób wygenerować w oparciu o taką bazę menu w formie
- Kategoria 1
-- podkategoria 1
-- podkategoria 2
---- podpodkategoria 1
---- podpodkategoria 2
---- podpodkategoria 3
-- podkategoria 3
...
...
Czyli im poziom niżej tym więcej "-".
aktualnie kombinuję z takim kodem:
  1. try {
  2. $tablicaA = $ms->query_select("SELECT id, title, parent_id FROM " . $GLOBAL['bfprzed'] . "multikategorie WHERE level = '2' ORDER by id ASC;");
  3. if (isset($tablicaA)) {
  4. foreach ($tablicaA as $wynA => $warttA) {
  5. if ($warttA['id'] !=325193){
  6. $select = null;
  7. if ($webid['1'] == $warttA['id'])
  8. $select = " style=\"color: #ff0000;\" ";
  9. $shortname = przyjazny_string(baza_odczyt($warttA['title']));
  10. $wlktab = 0; $wlktab = count($tablicaA);
  11. echo"<a href=\"kategorie,$warttA[id].html\" $select>$warttA[title] (XXXXXX)</a>";
  12. ////////
  13. if ($select != "") {
  14. try {
  15. $tablicaB = $ms->query_select("SELECT id, title, parent_id FROM " . $GLOBAL['bfprzed'] . "multikategorie WHERE parent_id = '$warttA[id]' ORDER by id ASC;");
  16. if (isset($tablicaB)) {
  17. foreach ($tablicaB as $wynB => $warttB) {
  18. $select = null;
  19. if ($webid['2'] == $warttB['id'])
  20. $select = " style=\"color: #ff0000;\" ";
  21. $shortname = przyjazny_string(baza_odczyt($warttB['title']));
  22. echo"<b><a href=\"kategorie,$warttA[id],$warttB[id].html\" $select>-$warttB[title]</a></b>";
  23. if ($select != "") {
  24. $tablicaC = $ms->query_select("SELECT id, title, parent_id FROM " . $GLOBAL['bfprzed'] . "multikategorie WHERE parent_id = '$warttB[id]' ORDER by id ASC;");
  25. if (isset($tablicaC)) {
  26. foreach ($tablicaC as $wynC => $warttC) {
  27. $select = null;
  28. if ($webid['3'] == $warttC['id'])
  29. $select = " style=\"color: #ff0000;\" ";
  30. $shortname = przyjazny_string(baza_odczyt($warttC['title']));
  31. echo"<b><a href=\"kategorie,$warttA[id],$warttB[id],$warttC[id].html\" $select>--$warttC[title]</a></b>";
  32.  
  33. }
  34. }
  35. }
  36. }
  37. }
  38. } catch (Exception $error) {
  39. echo '<b>Komunikat</b>: ' . $error->getMessage() . '<br /><b>Plik</b>: ' . $error->getFile() . '<br /><b>Wiersz</b>: ' . $error->getLine() . '<br /><b>IP</b>: ' . $_SERVER['REMOTE_ADDR'] . ' | <b>LINK</b>: ' . $_SERVER['REQUEST_URI'] . '<br /><br />' . $error->getTraceAsString();
  40. }
  41. }
  42. ////////
  43. }
  44. }}
  45. } catch (Exception $error) {
  46. echo '<b>Komunikat</b>: ' . $error->getMessage() . '<br /><b>Plik</b>: ' . $error->getFile() . '<br /><b>Wiersz</b>: ' . $error->getLine() . '<br /><b>IP</b>: ' . $_SERVER['REMOTE_ADDR'] . ' | <b>LINK</b>: ' . $_SERVER['REQUEST_URI'] . '<br /><br />' . $error->getTraceAsString();
  47. }


ale niestety mam dużo danych w bazie danych i menu wczytuje mi się dłuuuuugo sad.gif
Macie może jakiś pomysł jak to zrobić lepiej??:/

Northwest
!*!
rekurencja
bpskiba
Niewątpliwie rekurencja, ale................

Gdyby tak pokusić się o przerzucenie optymalizacji na silnik bazy danych. Może gdyby zapytać tak aby otrzymać dane "właściwie" posortowane:

  1. SELECT * FROM(
  2. SELECT id, title, parent_id,POSITION FROM cms_multikategorie WHERE POSITION=0
  3. UNION
  4. SELECT parent_id,title,parent_id,POSITION FROM cms_multikategorie WHERE POSITION>0
  5. ) AS ddd
  6. ORDER BY 1,4


trzeba jeszcze troszkę popracować nad tym zapytaniem smile.gif
!*!
Baza jest od wysyłania/odbierania a nie mielenia co, gdzie, jak ma "wyglądać" wink.gif
bpskiba
Cytat(!*! @ 8.08.2012, 07:58:53 ) *
Baza jest od wysyłania/odbierania a nie mielenia co, gdzie, jak ma "wyglądać" ;)


No rację to Ty masz, ale..................
jeżeli baza ma odpowiedzieć na 50 pytań, to lepiej napisać jedno zapytanie nieco trudniejsze i załatwić sprawę.
greycoffey
Nie lepiej pobrać wszystko w jednym zapytaniu, a dopiero potem to wyświetlić. Pobierasz do tablicy $rekordy[$idRekordu]. I wiążesz rekurencyjnie w PHP po id rodzica.
erix
Cytat
jeżeli baza ma odpowiedzieć na 50 pytań, to lepiej napisać jedno zapytanie nieco trudniejsze i załatwić sprawę.

Dasz sobie rękę uciąć?
bpskiba
Cytat(erix @ 8.08.2012, 10:16:16 ) *
Dasz sobie rękę uciąć?


no wiesz..... jestem bardzo przywiązany do swoich rąk snitch.gif i w niepewnej kwestii ryzykować nie będę.


erix
To nie siej herezji. tongue.gif
abort
erix, ale dla takiej bazy jaką ma autor (czyli ok. 50 rekordów) ja jednak robotę przerzuciłbym na skrypt, a nie na bazę.
Czyli: zebrał hurtem wszystkie dane i stworzył drzewko kategorii bezpośrednio w kodzie PHP, najlepiej za pomocą rekurencji (aż się prosi).
erix
Cytat
erix, ale dla takiej bazy jaką ma autor (czyli ok. 50 rekordów) ja jednak robotę przerzuciłbym na skrypt, a nie na bazę.

Piłem akurat stricte do czegoś innego.

Cytat
zebrał hurtem wszystkie dane i stworzył drzewko kategorii bezpośrednio w kodzie PHP, najlepiej za pomocą rekurencji (aż się prosi).

Jak najbardziej; zapytania w pętli, to nie jest coś, co baza lubi...
northwest
dziękuje bardzo za pomoc smile.gif

generalnie mam takie drzewko za zarządzania kategoriami: http://www.jstree.com/
i w nim pare tysięcy kategorii/podkategorii i grup (max ok 6 poziomów w niektórych przypadkach).

Powiem szczerze że próbowałem długo sam to ogarnąć, ale chyba to za wysoki poziom dla mnie,dlatego poprosiłem Was o pomoc sad.gif

może coś jeszcze podesłać, żeby było łatwiej rozwiazać ten problem?
!*!
Tylko że te drzewkoJS ni jak ma się do tego co pokazałeś. Wpisz w wyszukiwarkę "rekurencja, drzewo rekurencyjne" i masz miliony poprawnych skryptów.
northwest
tzn to drzewko działa w oparciu tą bazę danych.... smile.gif
ten skrypt który pokazałem ma wygenerować menu w oparciu o tą bazę smile.gif
!*!
To wygeneruj, na podstawie tego co zostało napisane wyżej.
bpskiba
Cytat(!*! @ 8.08.2012, 15:03:30 ) *
To wygeneruj, na podstawie tego co zostało napisane wyżej.

thumbsupsmileyanim.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.