[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?

0x01 graphic

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.

0x01 graphic

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>";

}

}

?>