Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] system kategorii
jankes83
post
Post #1





Grupa: Zarejestrowani
Postów: 32
Pomógł: 5
Dołączył: 23.12.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował jankes83 5.02.2010, 09:35:00
Go to the top of the page
+Quote Post
cojack
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
jankes83
post
Post #4





Grupa: Zarejestrowani
Postów: 32
Pomógł: 5
Dołączył: 23.12.2009

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Pilsener
post
Post #5





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jankes83
post
Post #6





Grupa: Zarejestrowani
Postów: 32
Pomógł: 5
Dołączył: 23.12.2009

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Pilsener
post
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jankes83
post
Post #8





Grupa: Zarejestrowani
Postów: 32
Pomógł: 5
Dołączył: 23.12.2009

Ostrzeżenie: (0%)
-----


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']]);
Go to the top of the page
+Quote Post
Pilsener
post
Post #9





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
jankes83
post
Post #10





Grupa: Zarejestrowani
Postów: 32
Pomógł: 5
Dołączył: 23.12.2009

Ostrzeżenie: (0%)
-----


Wszystko działa jak należy:)
Problemem były złe argumenty jakie podawałem funkcji display.. Dzieki za pomoc
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 01:40