Sposobów pewnie jest wiele. Ja mam tak:
tabela kategorie przechowująca kategorie:
kat_id
kat_kategoria
kat_cat
kat_order
CREATE TABLE `tabela`.`kategoria` (
`kat_id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`kat_kategoria` varchar( 255 ) collate utf8_polish_ci DEFAULT NULL ,
`kat_cat` int( 11 ) NOT NULL ,
`kat_order` int( 11 ) NOT NULL ,
UNIQUE KEY `id` ( `kat_id` ) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_polish_ci;
tabela tut_kat przechowująca powiązania przedmiotu (np. artykułu) z kategoriami:
id_tut
id_kat
CREATE TABLE `tabela`.`tut_kat` (
`kat_id` int( 11 ) NOT NULL AUTO_INCREMENT ,
`kat_kategoria` varchar( 255 ) COLLATE utf8_polish_ci DEFAULT NULL ,
`kat_cat` int( 11 ) NOT NULL ,
`kat_order` int( 11 ) NOT NULL ,
UNIQUE KEY `id` ( `kat_id` )
) ENGINE = MYISAM DEFAULT CHARSET = utf8 COLLATE = utf8_polish_ci
Wtedy masz do dyspozycji SELECT/OPTION z MULTIPLE (tu dodatkowo z OPTGROUP):
$kat_list = "";
$_GET['kat_id'] = '';
$result = dbquery("SELECT kat_id, kat_kategoria FROM kategorie WHERE kat_cat='0' ORDER BY kat_order");
if (dbrows($result) != 0) {
while ($data = dbarray($result)) {
$result2 = dbquery("SELECT kat_id, kat_kategoria FROM kategorie WHERE kat_cat='".$data['kat_id']."' ORDER BY kat_order");
if (dbrows($result2) != 0) {
$kat_list .= "<optgroup label='".$data['kat_kategoria']."'>\r\n";
while ($data2 = dbarray($result2)) {
$kat_list .= "<option value='".$data2['kat_id']."'>".$data2['kat_kategoria']."</option>\r\n";
}
$kat_list .= "</optgroup>\r\n";
}
}
}
echo '<select name="kat_id[]" id="kat" class="textbox" style="width: 150px" size="5" multiple>'.$kat_list.'</select>';