Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie mapy kategorii
Damiankossek
post
Post #1





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


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 (IMG:style_emoticons/default/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

Ten post edytował Damiankossek 10.12.2010, 07:40:14
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


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





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg) Ale ja już śpię ... Może wy mnie jutro jakoś nakierujecie (IMG:style_emoticons/default/smile.gif) Bo prawie wszystko mi działa tylko nie potrafie poprawnie drzewka zbudować ... (IMG:style_emoticons/default/winksmiley.jpg)

Dobranoc (IMG:style_emoticons/default/tongue.gif)

Ten post edytował Damiankossek 11.12.2010, 03:25:25
Go to the top of the page
+Quote Post
CuteOne
post
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  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 (IMG:style_emoticons/default/smile.gif)
dalej możesz dodać IP, zagłębienie itp.

Ten post edytował CuteOne 11.12.2010, 10:11:33
Go to the top of the page
+Quote Post
Damiankossek
post
Post #5





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


No właśnie ale chodzi mi o to jakim sposobem mogę stworzyć taką tablice (IMG:style_emoticons/default/winksmiley.jpg)
Jak wyciągnąć dane z bazy i jakim sposobem to przerobić żebym w każdej tablicy miał dzieci tego samego rodzica ...
Go to the top of the page
+Quote Post
CuteOne
post
Post #6





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Tam masz wszystko opisane (IMG:style_emoticons/default/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. }


Ten post edytował CuteOne 11.12.2010, 11:08:01
Go to the top of the page
+Quote Post
Damiankossek
post
Post #7





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


Tylko że mam mały problem (IMG:style_emoticons/default/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 ?
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Kohana OBSŁUGUJE concat, tylko trzeba wiedzieć JAK (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
Damiankossek
post
Post #9





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


Thek, uprzedziłeś mnie (IMG:style_emoticons/default/biggrin.gif) Właśnie leciałem na forum poprawić moją głupote z tym co napisałem że nie obsługuje (IMG:style_emoticons/default/tongue.gif) Przecież DB::QUERY() jest (IMG:style_emoticons/default/winksmiley.jpg)
To chyba przez to że siedziałem do 4.00 i na dodatek dziś od 11.00 do 23.00 w robocie (IMG:style_emoticons/default/smile.gif) Heh (IMG:style_emoticons/default/tongue.gif) Dzięki, będę kombinował

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

Wyniki mi zwraca takie same w obydwu przypadkach (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Quadina
post
Post #10





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


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





Grupa: Zarejestrowani
Postów: 118
Pomógł: 8
Dołączył: 10.12.2009

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


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 (IMG:style_emoticons/default/smile.gif) ?
Go to the top of the page
+Quote Post
Quadina
post
Post #12





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


Tak, w zupełności WHERE LIKE wystarczy.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 22:46