我需要一些认真的帮助或建议我花费无数个小时进行研究和空洞。
我有一个项目需要使用PHP从MDB数据库中提取数据。 我已经成功连接到数据库,我可以查询数据库并在表格中显示结果,我甚至可以使用文本输入搜索数据库。
我的客户想要一个具有多个下拉菜单的高级搜索功能。这些下拉列表从数据库中获取值。这一切仍然很好。我可以填充数据库中的下拉列表。
数据库是车辆数据库(Id,库存号,品牌,型号,年份,价格,功能等)。不幸的是,所有车辆数据都在一张表中。例如,数据库中有四辆ASTON MARTIN汽车,每辆汽车都有自己的ID和型号。
我知道最好至少有两个单独的表:make和model。但是数据库是由第三方应用程序生成的,该应用程序将数据库的副本保存到服务器,这是我连接的数据库。
问题是:使用PHP和AJAX,从同一个表中绘制数据时是否可以有级联下拉?例如,如果我从Make选择中选择ASTON MARTIN,第二个下拉列表只显示与ASTON MARTIN相关的模型?
请参阅以下尝试尝试此操作...此脚本成功将Make列从数据库加载到第一个下拉列表,将Modal列从数据库加载到第二个下拉列表,但它们未链接。目前的情况是,第一个选项是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列而不是model列填充第二个下拉列表。知道为什么吗?
谢谢你,Deon Jonker
答案 0 :(得分:0)
对于您的选择,您可以添加像这样的onchange属性
<select name="makeselection" onchange="filtermodelselection()">
你添加了一个函数filtermodelselection(),它从你的makeselection中读出所选的选项,比如(给你的表单命名,或者你的选择你的id,我现在使用“frm”作为formname)
var makeid=document.frm.makeselection.value;
您将ajax请求发送到该页面。然后使用makeid,您可以向服务器发出ajax请求,如下所示:http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_get_unique
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();
}
在服务器端,你得到一个$ _REQUEST ['ajaxmake']变量。
if (isset($_REQUEST['ajaxmake'])) {
//do the magic the query, and then echo like what you did here:
while ($rowModel = odbc_fetch_array($resultModel)) {
echo "<option value='$rowModel[Model]'>$rowModel[Model]</option>";
}
//then die, to not echo anything else accidentally
die();
}
示例输出:
<option value='AUDI'>AUDI</option>
<option value='BMW'>BMW</option>
在接收方面,使用ajax将服务器的接收值提供给modelSelection的innerHTML.like:
document.frm.modelselection.innerHTML=xmlhttp.responseText;
如果不清楚,请随时询问。
编辑: 把这部分:
<?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();
}
?>
到文件的开头。 (在任何包含之后,当然是数据库连接器代码)