Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie mapy kategorii
Forum PHP.pl > Forum > PHP
Damiankossek
Witam, mam następujący problem, ponieważ stworzyłem sobie w SQLu tabele z:

  1. id name path
  2. 1 Windows 0
  3. 2 Linux 0
  4. 3 Ms.Office 1
  5. 4 OpenOffice 2
  6. 5 Word 3
  7. 6 Writer 4
  8. 7 Excel 3
  9. 8 Access 3
  10. 9 Costam 5
  11. 10 CosTam2 6


0 w path oznacza że kategoria jest główną kategorią a dalej to po ID winksmiley.jpg

No i właśnie nie wiem czy dobrze zaprojektowałem tabele, ale chciałbym stworzyć listę kategorii czyli np:

  1. Windows
  2. - Ms.Office
  3. - Word
  4. -Costam
  5. -Execl
  6. -Access
  7.  
  8. Linux
  9. - OpenOffice
  10. - Writer
  11. - CosTam2


No i ogólnie na napisać na sztywno wyświetlanie to już nie taki problem, ale gdy nie wiem ile będzie podkategorii to nie wiem jak napisać to bardziej elastycznie ? Żeby sprawdziło mi czy ta podkategoria ma dalej podkategorie i jak tak to dołączyło je do tablicy.

Ma ktoś jakiś pomysł ? Czy trzeba na nowo innym sposobem zaprojektować tabelke w bazie ?

Pozdrawiam
CuteOne
Ehh temat wałkowany już setki razy... http://www.google.pl/search?client=opera&a...-8&oe=utf-8

lub sam poszukaj -> php + drzewo kategorii
Damiankossek
No ok ... Dzięki ale mam np. http://blog.mwojcik.pl/2008/02/17/drzewa-k...-php-metoda-ip/ i zaciąłem się na jednym czyli na:

  1. [0] => ([1] =>Unix, [2] => Windows)
  2. [1] => ([3] =>Linux, [4] =>BSD)
  3. [2] => ([5] =>Windows XP, [6] =>Windows 98)
  4. [3] => ([7] =>Ubuntu, [8] => Slackware)


W jaki sposób zrobić taką tablice ? Aby każda tablica zawierała dzieci z takim samym rodzicem ? Może jest już tak póżno że mój mózg nie myśli winksmiley.jpg ... Ale nie mogę wpaść na żaden pomysł, teoretycznie zrobiłbym to tak:

1. Pobrał z bazy rekordy o parent = 0 , odpowiednio przerobił co dałoby mi: 0 => ([1] => Unix, [2] => Windows)
2. Rozbił tablicę wyżej i znowu wykonał zapytanie do bazy o rekordy z parent = $id ($id wziełoby się z rozbitej tablicy z Unixem i Windowsem)
3. No i miałbym już drugą tablice ale teraz jak napisać tą funkcje dla reszty kategorii tak żebym zachował taką strukturę tabeli jaką bym chciał, bo to co niżej napisałem to raczej zacznie mi później robić tablicę w tablicy .. ?

  1. public function buildTree($id = 0)
  2. {
  3. $query = DB::SELECT('*') -> FROM('categories') -> WHERE('parentid','=',$id) -> execute() -> as_array();
  4.  
  5. $query = (array) $query;
  6.  
  7. if(count($query) == 0) return FALSE;
  8.  
  9. for($i = 0; $i < count($query); $i++)
  10. {
  11. $result[$query[$i]['id']] = $query[$i]['subject'];
  12. }
  13.  
  14. $array[] = $result;
  15.  
  16. $values = array_values($result);
  17.  
  18. for($i = 0; $i < count($values); $i++)
  19. {
  20. if(self::buildTree($values[$i]) != FALSE)
  21. {
  22. $array[] = self::buildTree($values[$i]);
  23. }
  24. }
  25.  
  26. return $array;
  27. }


Sorry jeżeli tutaj napisałem głupoty i problem jest banalny winksmiley.jpg Ale ja już śpię ... Może wy mnie jutro jakoś nakierujecie smile.gif Bo prawie wszystko mi działa tylko nie potrafie poprawnie drzewka zbudować ... winksmiley.jpg

Dobranoc tongue.gif
CuteOne
  1. 0 => ();
  2. 1 => ([0] => Unix, [1] => Windows, [2] => 0);
  3. 2 => ([0] =>Linux, [1] =>BSD, [2] => 0);

[0] i [1] chyba nie trzeba objaśniać ;p
[2] - parent_id smile.gif
dalej możesz dodać IP, zagłębienie itp.
Damiankossek
No właśnie ale chodzi mi o to jakim sposobem mogę stworzyć taką tablice winksmiley.jpg
Jak wyciągnąć dane z bazy i jakim sposobem to przerobić żebym w każdej tablicy miał dzieci tego samego rodzica ...
CuteOne
Tam masz wszystko opisane tongue.gif zauważyłem, że wybrali inne rozwiązanie niż ja ci opisałem tak więc postępuj zgodnie z instrukcją z tamtej strony
  1. $q=mysql_query('SELECT * FROM kategorie WHERE ip LIKE CONCAT("'.$cat['ip'].'.%")');
  2. $categories=array();
  3. while($r=mysql_fetch_assoc($q)){
  4. $categories[$r['parentID']][$r['id']]=$r;
  5. }
Damiankossek
Tylko że mam mały problem tongue.gif Korzystam z FrameWorka (Kohana) i tam raczej biblioteka do bazy nie obsługuje CONCAT :/ Robić to w najzwyklejszej bibliotece (tej co Ty podałeś) ? Czy może PDO ?
thek
Kohana OBSŁUGUJE concat, tylko trzeba wiedzieć JAK winksmiley.jpg Można to zrobić na 2 sposoby. Albo piszesz zapytanie "z palca" i walisz metodą query(), albo używasz Database Expression w query builderze. Przynajmniej w wersji 2.X, bo w 3.X były zmiany drobne query buildera (kumpel biurko obok pisze to mi wspomniał), a nie wgryzałem się jeszcze w gałąź 3.X nie pisałem sam, więc tylko mówię co od niego wiem.
Damiankossek
Thek, uprzedziłeś mnie biggrin.gif Właśnie leciałem na forum poprawić moją głupote z tym co napisałem że nie obsługuje tongue.gif Przecież DB::QUERY() jest winksmiley.jpg
To chyba przez to że siedziałem do 4.00 i na dodatek dziś od 11.00 do 23.00 w robocie smile.gif Heh tongue.gif Dzięki, będę kombinował

Czy się różni WHERE LIKE CONCAT od WHERE = ... ?

Wyniki mi zwraca takie same w obydwu przypadkach smile.gif
Quadina
No coś tutaj ktoś nadinterpretował. CONCAT odpowiada za połączenie stringów które ma w argumentach. Zatem podanie mu jednego argumentu zawsze da ten sam wynik. CONCAT stostuje się np. gdy chcesz jako jedną kolumnę z bazy wydrukować dwie kolumny fizyczne w bazie. Np. masz kolumny imię i nazwisko, możesz je sobie CONCATować w jedno pole przy pobieraniu danych z bazy. Jest również konstrukcja GROUP_CONCAT służąca do łączenia elementów pogrupowanych przez GROUP BY. Można w taki sposób wydrukować sobie wszystkie imiona po przecinku dla zapytania grupującego dane po nazwisku.
Damiankossek
Właśnie tak czytałem o tym CONCAT i coś mi nie pasowało, czyli może być poprostu WHERE LIKE cośtam ? Zamiast tego concatowania smile.gif ?
Quadina
Tak, w zupełności WHERE LIKE wystarczy.
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.