Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Dynamicznie budowane menu
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam takie pytanko, mam takie tabele:
  1. CREATE TABLE IF NOT EXISTS `cms_kategorie` (
  2. `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  4. `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  5. UNIQUE KEY `id` (`bf_id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  7.  
  8. CREATE TABLE IF NOT EXISTS `cms_podkategorie` (
  9. `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  10. `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  11. `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  12. `kategoria` int(11) NOT NULL,
  13. `podkategoria` int(11) NOT NULL,
  14. UNIQUE KEY `id` (`bf_id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
  16.  
  17. REATE TABLE IF NOT EXISTS `cms_podpodkategorie` (
  18. `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  19. `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  20. `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  21. UNIQUE KEY `id` (`bf_id`)
  22. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


chciałbym w zbudować menu na zasadzie:
- kategoria
-- podkategorie
--- podpodkategorie

Czy da się to jakoś w 1 zapytaniu wyświetlić? Ew. w php?

Próbowalem czymś takim:
  1. $tablicaAA = $ms->query_select("select bf_id, nazwa from cms_kategorie WHERE enable = '1' ORDER by nazwa ASC;");
  2. if (isset($tablicaAA)) {
  3. foreach ($tablicaAA as $wynAA => $warttAA) {
  4. $tablicaa[] = array("name" => $warttAA['nazwa'], "id" => $warttAA['bf_id']);
  5. $tablicaB = $ms->query_select("select bf_id, nazwa, podkategoria from cms_podkategorie WHERE kategoria = '" . $warttAA['bf_id'] . "' and enable = '1' ORDER by nazwa ASC;");
  6. if (isset($tablicaB)) {
  7. foreach ($tablicaB as $wynB => $warttB) {
  8. $tablicaa[] = array("name" => "<span></span>$warttB[nazwa]", "id" => $warttB['bf_id']);
  9. $tablicaC = $ms->query_select("select bf_id, nazwa from cms_podpodkategorie WHERE bf_id = '" . $warttB['podkategoria'] . "' and enable = '1' ORDER by nazwa ASC;");
  10. if (isset($tablicaC)) {
  11. foreach ($tablicaC as $wynC => $warttC) {
  12. $tablicaa[] = array("name" => "<span></span><span></span>$warttC[nazwa]", "id" => $warttC['bf_id']);
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }


Problem w tym, że w wyniku działania tego skryptu otrzymuję:
Kategoria
- podpodkategoria 1
- podkategoria 1
- podpodkategoria 1
- podkategoria 2

Czyli nie dość że nie wyświetla w poprawnej kolejności, to jeszcze powiela podpodkategorie sad.gif

Ma ktoś pomysł na to może?


Northwest
marcio
Zainteresuj sie relacjami JOIN w MYSQL.
northwest
tzn próbowałem z takim zapytaniem:
SELECT * FROM cms_kategorie A INNER JOIN cms_podkategorie C ON A.podkategoria = C.bf_id INNER JOIN cms_podpodkategorie D ON A.podpodkategoria = D.bf_id ORDER by A.kategoria, A.podkategoria, A.podpodkategoria ASC

tylko nie wiem jak to skleić w całość sad.gif
wNogachSpisz
Bazy danych SQL nie są najlepsze w przechowywaniu danych zorganizowanych hierarchicznie.
Dużo lepiej nadaje się do tego XML ;p
toffiak
Najlepszym nie, ale jeśli chodzi o menu to nie ma z tym żadnego problemu. Tylko że nie w taki sposób jak to próbuje northwest, co się stanie gdy dojdzie 4 poziom, dodać podpodpodkategoria ? raczej nie.

Najłatwiejszym sposobem jest to
northwest
te "drzewka" znam smile.gif tylko problem w tym że nie mogę zmieniać układu tabel sad.gif dotychczas były tylko 2 poziomy, teraz doszedł 3 sad.gif

da się to jakoś w tej chwili postawić żeby działało poprawnie? macie może jakiś pomysł?smile.gif
toffiak
Piszesz że na początku były 2 tabele to znaczy że pole podkategoria dla tabeli cms_podkategorie zostało dodane ?

W tej chwili układ nie ma sensu między tabelą cms_kategorię a cms_podkategorię jest relacja 1:n
a między tabelą cmd_podkategoria a cms_podpodkategoria n:1, chyba powinno być 1:n, wtedy wykonując join na tych tabelach zaczynając od cms_lategoria, cms_podkategoria i cms_podpodkategoria uzyskasz rekordy w których wystarczy iterować (w php) po danym poziomie i uzyskać dostęp do każdego rekordu.
northwest
no własnie sad.gif problem w tym że jest nie mogę zmieniać tabel za bardzo i nie mogę sobie z tym poradzić sad.gif

Czysto z mysql sie nie da?
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.