如何在PHP和AJAX中实现级联下拉列表?

时间:2014-02-13 11:47:51

标签: php ajax ms-access odbc cascadingdropdown

我需要一些认真的帮助或建议我花费无数个小时进行研究和空洞。

我有一个项目需要使用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

1 个答案:

答案 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();
             }
   ?>

到文件的开头。 (在任何包含之后,当然是数据库连接器代码)