Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] system kategorii
Forum PHP.pl > Forum > Przedszkole
jankes83
Witam

Próbuje zrobić prosty system kategorii do galerii zdjęć. Na razie osiągnąłem tylko możliwość dodawania głównej kategorii i jednej podkategorii.
Struktura bazy wyglada mniej wiecej tak:
Kategorie
|id||name||parent_id|
1 Kat1 0
2 Kat2 0
3 Kat3 2
4 Kat4 2
5 Kat5 1

Przy tym rozwiązaniu mogę dodać do kazdej kategorii wiele podkategorii, i do kazdej podkategorii wiele podpodkategorii itd.
Mam jednak problem z banalna sprawą. W jaki sposób wyświetlić to gdziekolwiek?

W tym momencie mam skrypt ktory działa mniej wiecej w ten sposób:

1. Wyswietl pierwsza kategorie i sprawdz czy `parent_id` <> 0;
2. Jesli tak to wykonaj nowe zapytanie sql, w ktorym wyszukasz wszystkie podkategorie z `parent_id` = id

Te rozwiazanie jest wg mnie dobre ale tylko jesli ma wyswietlac się jedno "zaglebienie". Gdybym chciał wiecej tych "zaglebien" to musiałbym dla kazdego robić kolejne zapytanie, a chcialbym zeby ilość zaglebien była dynamiczna.

Podsumowując:

Tak mi się wyświetla:

  1. Kategoria ppierwsza
    1. Podkategoria pierwsza
    2. Podkategoria druga
    3. Podkategoria trzecie
  2. Kategoria druga
  3. Kategoria trzecia
  4. Kategoria czwarta

Chciałbym wyświetlać tak:

  1. Kategoria pierwsza
    1. Podkategoria pierwsza
    2. Podkategoria druga
      1. Podpodkategoria pierwsza
      2. Podpodkategoria druga
        1. Podpodpodkategoria pierwsza
          1. Itd, itd....
  2. Kategoria druga
  3. Kategoria trzecia
  4. Kategoria czwarta

Z góry dziękuję za pomoc.
cojack
To się nazywa struktura drzewiasta, możesz poczytać o tym tu:

http://www.cojack.pl/postgresql-ltree/284
http://www.depesz.com/index.php/2008/04/11...n-trees-in-sql/
http://dev.mysql.com/tech-resources/articl...hical-data.html

Polecam drugiego linka, gdyż pierwszego możesz nie ogarnąć. Albo trzeciego.
Pilsener
A ja polecam drzewa metodą IP:
http://blog.mwojcik.pl/2008/02/17/drzewa-k...-php-metoda-ip/

Jest tam nawet rekurencyjna funkcja do wyświetlania wyników, kto nie umie skorzystać sam sobie winien smile.gif
jankes83
Pilsner, Niestety utknałem na wyświetlaniu kategorii. Nie wiem w jaki sposób mam uzyskać taką tablicę:

[0] => ([1] =>Unix, [2] => Windows)
[1] => ([3] =>Linux, [4] =>BSD)
[2] => ([5] =>Windows XP, [6] =>Windows 98)
[3] => ([7] =>Ubuntu, [8] => Slackware)
Pilsener
To tablica wielowymiarowa, pierwszy indeks to ID rodzica, natomiast drugi to właściwy ID danej kategorii.

Masz tam przecież kod:
  1. while($r=mysql_fetch_assoc($q)){
  2. $categories[$r['parentID']][$r['id']]=$r;
  3. }
- oczywiście zapytanie to SELECT * from kategorie, następnie należy użyć funkcji, która jest także podana poniżej.
jankes83
Wiem, że na tamtej stronie jest kod.
Nie moge jednak tego ogarnąć.
  1. $cat['ip'] = $_GET['k'];
  2.  
  3.  
  4. $q=mysqli_query($mysqli, 'SELECT * FROM kategorie WHERE ip LIKE CONCAT("'.$cat['ip'].'.%")');
  5. $categories=array();
  6. while($r=mysqli_fetch_assoc($q)){
  7. $categories[$r['parentID']][$r['id']]=$r;
  8. echo display($categories[$r['id']], $categories[$r['parentID']]);
  9. }

ten kod niestety nie chce działać.. po prostu nic się nie wyświetla. Nie wiem czy podstawiam do funkcji odpowiednie zmienne...
Pilsener
A po co Ci ten concat tam? To jest potrzebne po to (taka jest idea IP), by łatwo przenosić czy kasować poszczególne gałęzie drzewa. Tobie wystarczy zapytanie select * from kategorie. I nazwy pól w pętli while musisz mieć takie same jak w Twojej tabeli, czyli id i parent_id.

I nie wyświetlaj tego w pętli, tylko poza pętlą winksmiley.jpg

Najpierw w ogóle daj:
  1. print_r($categories);
- i zobacz, czy dane ładują się do tablicy.
jankes83
Mam ten kod:
  1. function display($parentID, $tab) {
  2. if (!is_array($tab[$parentID])) return; #czy kategoria ma podkategorie?
  3. echo '<ul>';
  4. foreach ($tab[$parentID] as $element) { #iteracja podkategorii
  5. echo '<li>'.$element['name'];
  6. display($element['id'], &$tab); #wyswietlenie podkategorii
  7. echo '</li>';
  8. }
  9. echo '</ul>';
  10. }
  11.  
  12. $q=mysqli_query($mysqli, 'SELECT * FROM kategorie');
  13. $categories=array();
  14. while($r=mysqli_fetch_assoc($q)){
  15. $categories[$r['parentID']][$r['id']]=$r;
  16.  
  17. }
  18. echo display($categories[$r['parentID']], $categories[$r['parentID']][$r['id']]);
  19.  


wszystkie dane znajdują się w tablicy, ale funkcja display nie zwraca nic.

Czy wrzucam tu dobre zmienne?:
  1. echo display($categories[$r['parentID']], $categories[$r['parentID']][$r['id']]);
Pilsener
1. Echo jest niepotrzebne, bo robi to już ta funkcja
2. Dajesz jej złe argumenty, pierwszy argument to ID gałęzi, które chcesz wyświetlić (jak całe drzewo to 0), natomiast drugi argument to tablica kategorii:
  1. display(0,$tablica);

3. Sprawdź funkcją print_r, czy tablica zawierająca drzewo jest poprawna
jankes83
Wszystko działa jak należy:)
Problemem były złe argumenty jakie podawałem funkcji display.. Dzieki za pomoc
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.