我需要一些認真的幫助或建議,我花費了無數個小時來研究和提出空洞的事情。如何在PHP和AJAX中實現級聯下拉菜單?
我有一個項目,我需要使用PHP從MDB數據庫中提取數據。 我已經成功連接到數據庫,我可以查詢數據庫並在表格中顯示結果,我甚至可以使用文本輸入來搜索數據庫。
我的客戶需要具有多個下拉菜單的高級搜索功能。這些下拉列表正在從數據庫中獲取值。這一切都還好。我可以填充數據庫的下拉列表。該數據庫是一個車輛數據庫(編號,庫存號,品牌,型號,年份,價格,功能等)。不幸的是,所有的車輛數據都在一張桌子上。例如,數據庫中有四輛ASTON MARTIN汽車,每輛汽車都有自己的ID和型號。
我知道最好至少有兩個單獨的表:make和model。但數據庫是由第三方應用程序生成的,該應用程序將數據庫的副本保存到服務器,並且這是我連接的那個。
現在的問題是:使用PHP和AJAX,從同一張表中繪製數據時,是否可能會有級聯下拉菜單?例如,如果我從Make selection中選擇了ASTON MARTIN,第二個下拉列表只會顯示與ASTON MARTIN相關的模型?
請參閱下面的嘗試嘗試...此腳本成功地將數據庫中的生成列加載到第一個下拉列表,並將數據庫中的模式列加載到第二個下拉列表中,但它們未鏈接。目前,第一個選項是ASTON MARTIN,它的相應模型是CORSA(這根本不正確)。
<script type="text/javascript">
function loadXMLDoc() {
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.frm.modelSelection.innerHTML=xmlhttp.responseText;
}
}
var makevalue=document.frm.makeSelection.value;
xmlhttp.open("GET","?ajaxmake="+makevalue,true);
xmlhttp.send();
}
</script>
<?php
$dbName = "C:/xampp/htdocs/new/db/savvyautoweb.mdb";
// Throws an error if the database cannot be found
if (!file_exists($dbName)) {
die("Could not find database file.");
}
// Connects to the database
// Assumes there is no username or password
$conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", '', '');
?>
<form action="" method="post" name="frm">
<select name="makeSelection" onchange="loadXMLDoc()">
<?php
$resultMake = odbc_exec($conn, "SELECT Make FROM Vehicle ORDER BY Make") or die (odbc_errormsg());
while ($rowMake = odbc_fetch_array($resultMake)) {
echo "<option value='$rowMake[Make]'>$rowMake[Make]</option>";
}
?>
</select>
<select name="modelSelection">
<?php
if (isset($_REQUEST['ajaxmake'])) {
$resultModel = odbc_exec($conn, "SELECT Model FROM Vehicle") or die (odbc_errormsg());
while ($rowModel = odbc_fetch_array($resultModel)) {
echo "<option value='$rowModel[Model]'>$rowModel[Model]</option>";
}
die();
}
?>
</select>
<input type="submit" name="submit" value="Go">
</form>
編輯運至上述代碼根據您的解決方案。這次真是萬分感謝。
該函數似乎可以工作,但它使用make列而不是模型列填充第二個下拉列表。任何想法爲什麼?
謝謝你,出溫瓊克
謝謝你的迴應。那麼filtermodelselection()函數會是什麼樣子呢?我不太確定你的意思,「在服務器端,你可以使用查詢來過濾模型,然後你可以發送回選項作爲帶回聲的字符串」?當談到AJAX/Javascript時,我真的很綠。 – Deon
我已經爲你更新了。忘了編輯onreadystatechange。保持第二個 – LaczkoUr
編輯onreadystatchange。請注意,這不是最好的解決方案,它會更好,逐個刪除選項,然後逐個添加它們,而不是此innerHTML轉儲。但是這會更復雜 – LaczkoUr