[MySQL][PHP] Jak wykonać podwójne, rozwijane pole wyboru typu lista, w którym zawartość drugiego pola zależy od wyboru wartości w pierwszym?
Chcesz stworzyć formularz z dwoma, rozwijanymi polami wyboru. Wybór opcji w jednym powoduje zmianę wartości do wyboru w drugim. Przy wybraniu jakiegoś tematu z pierwszej listy, w drugiej dostaje się tylko opcje należące do tej kategorii.
Sposób wykonania takiego formularza opisałem dokładnie w osobnej poradzie. Tutaj pokażę, jak wypełnić pola wyboru danymi pobranymi wprost z tabeli, z bazy danych.
Załóżmy że w pierwszym polu znajdzie się marka samochodu, a w drugim model. Dopiero po wybraniu tych dwóch wartości nastąpi wyszukiwanie roczników tych modeli dostępnych chociażby w potencjalnym serwisie ogłoszeniowym. Wykorzystajmy do prześledzenia mechanizmu uzupełniania pól prostą tabelę o nazwie auta. Niech jej zawartość prezentuje się następująco:
+-------+---------+------+
| marka | model | rok |
+-------+---------+------+
| Ford | Escort | 1998 |
| Ford | Escort | 1999 |
| Ford | Sierra | 1990 |
| Opel | Corsa | 1996 |
| Opel | Corsa | 1993 |
| Opel | Corsa | 1995 |
| Opel | Vectra | 1999 |
| Opel | Vectra | 1998 |
| Opel | Astra | 1999 |
| Fiat | Punto | 2001 |
| Fiat | Punto | 2001 |
| Fiat | Brava | 2001 |
| Fiat | Tipo | 1992 |
| Fiat | Siena | 1998 |
| Fiat | Siena | 1997 |
| Fiat | Punto | 2002 |
| Opel | Vectra | 2001 |
| Ford | Sierra | 1989 |
| Ford | Mustang | 1994 |
| Ford | Escort | 1996 |
+-------+---------+------+
Aby uzupełnić pola wyboru trzeba wyciągnąć wszystkie marki w taki sposób, aby nie powtarzały się, co zapewni nam polecenie DISTINCT(). Gdy mamy już marki, wystarczy sprawdzić ile ich jest.
W pętli marki dodawane są do tablicy $tmarki, a na podstawie nazwy marki pobierane są modele tej marki i też w pętli dodawane są do tablicy dwuwymiarowej $tmodele. W ten sposób mamy marki i modele w osobnych tablicach. Możemy rozłączyć się już z bazą danych.
Dalsza część skryptu to wypełnienie formularza danymi, czyli odczytanie tabel z marką oraz modelem i w pętli wstawienie tych danych do gotowego skryptu z poprzedniej porady. I to w zasadzie wszystko, poniżej gotowy skrypt:
<?
$baza = mysql_connect("localhost", "user", "password");
mysql_select_db("baza1",$baza);
$marki = mysql_query("SELECT DISTINCT(marka) FROM auta;",$baza);
for ($i=0;$i<mysql_num_rows($marki);$i++) {
$marka = mysql_fetch_row($marki);
$tmarki[]=$marka[0];
$wynik = mysql_query("SELECT DISTINCT(model)
FROM auta WHERE marka='$marka[0]';",$baza);
for ($j=0;$j<mysql_num_rows($wynik);$j++) {
$model = mysql_fetch_row($wynik);
$tmodele[$i][$j] = $model[0];
}
}
mysql_close($baza);
echo '<form name="form1" action="index.php" method="get">
<select name="lista1" onChange="zmien(this.options.selectedIndex)">';
foreach ($tmarki as $linia) echo "<option>$linia</option>";
echo '</select>
<select name="lista2"></select>
<input type="submit" value="Szukaj">
</form>';
echo '
<script language="javascript" type="text/javascript">
<!--
function zmien(wybor) {
l2=document.form1.lista2;
for (i=l2.options.length;i>=0;i--) l2.options[i]=null;
for (i=0;i<opcje[wybor].length;i++)
l2.options[i]=new Option(opcje[wybor][i].value,opcje[wybor][i].text);
}
ile_lista1=document.form1.lista1.options.length;
opcje=new Array(ile_lista1)
for (i=0;i<ile_lista1;i++) opcje[i]=new Array();
';
for ($i=0;$i<count($tmodele);$i++) {
for ($j=0;$j<count($tmodele[$i]);$j++) {
echo "opcje[$i][$j]=new Option(\"";
echo $tmodele[$i][$j]."\",\"".$tmodele[$i][$j]."\");\n";
}
}
echo 'zmien(0);
//-->
</script>';
?>
Jeżeli chcesz wyszukiwać wybrane wartości w tabeli, możesz posłużyć się przykładowym skryptem wyszukującym dane na podstawie powyższego formularza:
<?
$marka = $_GET["lista1"];
$model = $_GET["lista2"];
if ($marka<>"" and $model<>"") {
$sql="SELECT * FROM auta WHERE marka='$marka' and model='$model';";
$baza = mysql_connect("localhost", "user", "password");
mysql_select_db("baza1",$baza);
$wynik = mysql_query($sql,$baza);
mysql_close($baza);
$wierszy = mysql_num_rows($wynik);
$pol = mysql_num_fields($wynik);
for ($i=0;$i<$wierszy;$i++) {
$wiersz = mysql_fetch_row($wynik);
for ($j=0;$j<$pol;$j++) echo $wiersz[$j]." ";
echo "<br>";
}
}
?>