Dynamicznie budowane menu

0

Witam serdecznie,
Mam takie pytanko, mam takie tabele:

 
CREATE TABLE IF NOT EXISTS `cms_kategorie` (
  `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  UNIQUE KEY `id` (`bf_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
CREATE TABLE IF NOT EXISTS `cms_podkategorie` (
  `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  `kategoria` int(11) NOT NULL,
  `podkategoria` int(11) NOT NULL,
  UNIQUE KEY `id` (`bf_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
 
REATE TABLE IF NOT EXISTS `cms_podpodkategorie` (
  `bf_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(120) COLLATE utf8_unicode_ci DEFAULT NULL,
  `enable` char(1) COLLATE utf8_unicode_ci NOT NULL,
  UNIQUE KEY `id` (`bf_id`)
) 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:

 
$tablicaAA = $ms->query_select("select bf_id, nazwa from cms_kategorie WHERE enable = '1' ORDER by nazwa ASC;");
if (isset($tablicaAA)) {
    foreach ($tablicaAA as $wynAA => $warttAA) {
      $tablicaa[] = array("name" => $warttAA['nazwa'], "id" => $warttAA['bf_id']);
      $tablicaB = $ms->query_select("select bf_id, nazwa, podkategoria from cms_podkategorie WHERE kategoria = '" . $warttAA['bf_id'] . "' and enable = '1' ORDER by nazwa ASC;");
        if (isset($tablicaB)) {
            foreach ($tablicaB as $wynB => $warttB) {
                $tablicaa[] = array("name" => "<span></span>$warttB[nazwa]", "id" => $warttB['bf_id']);
                $tablicaC = $ms->query_select("select bf_id, nazwa from cms_podpodkategorie WHERE bf_id = '" . $warttB['podkategoria'] . "' and enable = '1' ORDER by nazwa ASC;");
                if (isset($tablicaC)) { 
                    foreach ($tablicaC as $wynC => $warttC) {
                        $tablicaa[] = array("name" => "<span></span><span></span>$warttC[nazwa]", "id" => $warttC['bf_id']);
                    }
                }
            }
        }
    }
}

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

Ma ktoś pomysł na to może?

Northwest

0

wtf? "podpodkategorie" o.O
nie możesz zapisac ID rodzica?
do tego potrzebujesz tylko jednej tabelki.

0

Najprościej ( nie najwydajniej )

menu_id, menu_label, menu_parent, menu_link, menu_sort

czyli chcąc zrobić takie cos
menu1
-submenu
-- subsubmenu
menu2

1 | menu1 | 0 | # | 0
2 | submenu | 1 | # | 0
3 | subsubmenu | 2 | # | 0
4 | subsubmenu | 0 | # | 0

poczytaj o drzewach IP

1 użytkowników online, w tym zalogowanych: 0, gości: 1