Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlanie listy rekordów
Forum PHP.pl > Forum > Przedszkole
cisu
Witam. Do rzeczy. Oto moja tabelka foldery:
Kod
folder_id    folder_name    folder_parent
00000000001    AAA            00000000000
00000000002    BBB            00000000001
00000000003    CCC            00000000002
00000000004    DDD            00000000002
00000000005    EEE            00000000002
00000000006    FFF            00000000001
00000000007    GGG            00000000006
00000000008    HHH            00000000006
00000000009    III            00000000000

Potrzebuję teraz funkcji, która wyświetli takie drzewko
Kod
AAA
    BBB
        CCC
        DDD
        EEE
    FFF
        GGG
        HHH
III

Ma brać id rodzica i wyświetlać wszystkie podfoldery itd, nieważne ile będzie podfolderów, żeby analogiczne drzewko robiło.
Napisałem jedną, potem przerobiłem, nie działa. Zależy mi na jak najmniejszej liczbie zapytań do bazy.

Moja funkcja:
  1. function displayAllFoldersList($root, $level) {
  2. $query = mysql_query("SELECT * FROM foldery WHERE folder_parent='" . $root . "'");
  3. while($folder = mysql_fetch_assoc($query)) {
  4. echo "|-";
  5. for($i=0;$i<$level;$i++) {
  6. echo "-";
  7. }
  8. echo $folder['folder_name']."<br />";
  9. displayAllFoldersList($folder['folder_id'], $level);
  10. $level++;
  11. }
  12. }
Wyświetla mi to
Kod
|--AAA
|---BBB
|----CCC
|-----DDD
|------EEE
|----FFF
|---III
i za każdym razem wysyła zapytanie. Kombinowałem z tym na różne sposoby i nigdy nie jest tak, jak ma być (zamiast tabulatorów wyświetla "-" a oprócz tego przed każdym rekordem "|-", dlatego wygląda inaczej).

Pomoże ktoś?
picios
cześć,
Sprawę troszkę komplikujesz. Wystarczy wszystkie "foldery" pobrać tylko raz, a później juz tylko operować na nich w pamięci. Poniżej kod
  1. <?php
  2. function displayAllFoldersList($query = null, $rodzicId = 0, $zaglebienie = 0, $wynik = null) {
  3. if ($wynik === null)
  4. $wynik = array();
  5. if ($query === null) {
  6. // w twoim skrypcie $query oznacza zapytanie do bazy więc tak zostawiłem
  7. // tutaj zamiast araay() wpisz
  8. // mysql_query("SELECT * FROM foldery");
  9. $query = array(
  10. array('folder_id' => 1, 'name' => 'pierwszy', 'folder_parent' => '0'),
  11. array('folder_id' => 2, 'name' => 'drugi', 'folder_parent' => '0'),
  12. array('folder_id' => 3, 'name' => 'trzeci', 'folder_parent' => '0'),
  13. array('folder_id' => 4, 'name' => 'pierwszy-1', 'folder_parent' => '1'),
  14. array('folder_id' => 5, 'name' => 'pierwszy-2', 'folder_parent' => '1'),
  15. array('folder_id' => 6, 'name' => 'trzeci-1', 'folder_parent' => '3'),
  16. array('folder_id' => 7, 'name' => 'trzeci-2', 'folder_parent' => '3'),
  17. array('folder_id' => 8, 'name' => 'trzeci-1-1', 'folder_parent' => '6'),
  18. array('folder_id' => 9, 'name' => 'trzeci-1-2', 'folder_parent' => '6'),
  19. array('folder_id' => 10, 'name' => 'trzeci-1-3', 'folder_parent' => '6')
  20. );
  21.  
  22. }
  23. foreach ($query as $kat) {
  24. if ($kat["folder_parent"] == $rodzicId) {
  25. $kat["zaglebienie"] = $zaglebienie;
  26. $wynik[] = $kat;
  27. $wynik = displayAllFoldersList($query, $kat["folder_id"], ($zaglebienie + 1), $wynik);
  28. }
  29. }
  30. return $wynik;
  31. }
  32.  
  33. // pobranie płaskiej tablicy, ale z oznaczeniem poziomu zaglebienia
  34. $drzewko = displayAllFoldersList();
  35. echo "<pre>";
  36. foreach($drzewko as $galaz) {
  37. echo "<br />*" . str_repeat("\t", $galaz['zaglebienie']) . $galaz['name'];
  38. }
  39. ?>
Ta tablica $query = array(blablabla) to tylko symulacja twojej bazy bo nie mam dostępu. Stosujesz też dziwne - nmie odpowiadające rzeczywistości - nazwy zmiennych. Np $query to u ciebie wynik zapytania ale zostawilem jak jest. Sprawdz ten skrypt.
pozdro
cisu
Ok usunąłem już tamte błędy, ale pojawiły się dziwne anomalie. Otóż w funkcji mam teraz tak:
  1. if ($wynik === null)
  2. $wynik = array();
  3. if ($query === null) {
  4. $query = mysqlQuery("SELECT * FROM folders ORDER BY folder_parent, folder_name ASC");
  5. // mysqlQuery to to samo co mysql_query, tylko mi zlicza zapytania jeszcze
  6. }
  7. $result = mysql_fetch_assoc($query);
  8. foreach ($result as $kat => $value) {
  9. if ($kat["folder_parent"] == $rodzicId) {
  10. $kat["zaglebienie"] = $zaglebienie;
  11. $wynik[] = $kat;
  12. $wynik = displayAllFoldersList($query, $kat["folder_id"], ($zaglebienie + 1), $wynik);
  13. }
  14. }
  15. return $wynik;

W kodzie strony mam
  1. $drzewko = displayAllFoldersList(null, 0, 0, null);
  2. echo "<pre>";
  3. foreach($drzewko as $galaz => $val) {
  4. echo $galaz . " -> " . $val . "<br />";
  5. }
  6. echo "</pre>";

Przerobiłem tak, żeby znaleźć błąd i co widzę?
Kod
0 -> 0older_id
1 -> 0older_name
2 -> 0older_parent
3 -> 0older_user
4 -> 0older_protected
5 -> 0older_password

Skrypt zmienił nazwy pól. Nie wiem czemu zamiast "folder_..." jest "0older...". Co tam jest nie tak?

f5
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.