Cześć
Założmy że mamy dwie tabele
przy_film
SQL
CREATE TABLE IF NOT EXISTS przy_film
(
id_film
int(11) NOT NULL auto_increment,
tytul
varchar(80) character set utf8 collate utf8_polish_ci NOT NULL,
PRIMARY KEY (id_film
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=203 ;
prz_gatunek
SQL
CREATE TABLE IF NOT EXISTS `przy_gatunek` (
`id_gatunek` int(11) NOT NULL auto_increment,
`gatunek` varchar(30) character set utf8 collate utf8_polish_ci NOT NULL,
PRIMARY KEY (`id_gatunek`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
przy_film_has_przy_gatunek
SQL
CREATE TABLE IF NOT EXISTS `przy_film_has_przy_gatunek` (
`id_film` int(11) NOT NULL,
`id_gatunek` int(11) NOT NULL,
PRIMARY KEY (`id_film`,`id_gatunek`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Każdemu filmowi przyporządkowany jest dokladnie jeden gatunek - jeden gatunek może być przyporządkowany wielu filmom - RELACJA 1:n
dla tabeli przy_film_has_przy_gatunek rekordy wyglądaj następująco
id_film/id_gatunku
1, 4
2, 4
3, 1
4, 2
5, 3
O ile w wypadku wyświetlania w formularzu rozwijanej listy z gatunkami wszystko jest OK to nie potrafie uporać się z zapisem do bazy.
Mała Legenda:
$aDBC - ustanawia połączenie do bazy
$SQL - zmienna przechowuje zapytanie SQL
FieldByName(); - pobiera rekordy z bazy
ExecSQL($SQL); - wykonuje zapytanie do bazy SQL
Next(); - zwraca kolejne rekordy
zapytanie SQL zostalo przerobione z zupełnie innego przykladu, a zmienne dostosowane do moich potrzeb...
Formularz wynik pliku php
HTML
<tr>
<td>Gatunek</td>
<td>
<select name="gatunek">
<option value="4">aaa</option>
<option value="2">fabularny</option>
<option value="3">horror</option>
<option value="1">komedia</option>
</select>
</td>
</tr>
plik php tworzący formularz
Kod PHP
<tr><td>Gatunek</td><td>
<?php
$SQL = " select pg.id_gatunek as id_g, gatunek, pfhpg.id_gatunek as id_check_g";
$SQL .= " from przy_gatunek pg left outer join przy_film_has_przy_gatunek pfhpg on (pg.id_gatunek=pfhpg.id_gatunek";
$SQL .= " and pfhpg.id_film=".$ID_FILM .")";
$SQL .= " order by gatunek";
$aDBC->ExecSQL ($SQL);
do{
$lista .= '<option value="'.$aDBC->FieldByName ("id_g") .'">'.$aDBC->FieldByName ("gatunek") .'</option>';
// if ($aDBC->FieldByName ('id_gatunek') ==
// if ($aDBC->FieldByName ('id_g') == 'id_gatunek')
// print (" checked ");
}while ($aDBC->Next());
echo '<select name="gatunek">'.$lista.'</select>';
?>
</td></tr>
fragment pliku zapisu
Kod PHP
<?php
include ("define.php");
if (empty ($aDBC))
{
include ("dbmysql.php");
$aDBC = new DBMySQL($MySQLServer,$MySQLDB,$MySQLUser,$MySQLPass);
}
if (empty ($aDBC1))
{
$aDBC1 = new DBMySQL($MySQLServer,$MySQLDB,$MySQLUser,$MySQLPass);
}
$ID_FILM = $_REQUEST['ID_FILM'];
$ID_GATUNEK = $_REQUEST['ID_GATUNEK'];
$_POST['gatunek'];
//(..)
//wybieramy gatunek z listy
$SQL = "delete from przy_film_has_przy_gatunek where id_film=". $ID_FILM;
$aDBC->ExecSQL ($SQL);
$SQL = " select pg.id_gatunek as id_g, gatunek, pfhpg.id_gatunek as id_check_g";
$SQL .= " from przy_gatunek pg left outer join przy_film_has_przy_gatunek pfhpg on (pg.id_gatunek=pfhpg.id_gatunek";
$SQL .= " and pfhpg.id_film=".$ID_FILM .")";
$SQL .= " order by gatunek";
$aDBC->ExecSQL ($SQL);
do{
$SQL = "insert into przy_film_has_przy_gatunek (id_gatunek, id_film) values (";
$SQL .= $aDBC->FieldByName ("id_g");
$SQL .= "," . $ID_FILM;
$SQL .= ")";
$aDBC->ExecSQL ($SQL);
}while ($aDBC->Next());
$_REQUEST['ID_FILM'] = "0";
header('Location: lista_film.php');
include ("index.php");
?>
W rezultacie skrypt zapisze tylko pierwsze pole do bazy danych w liście rozwijanej, a ma zapisać wybrane.
Pozdrawiam