【问题标题】:Multiple selection boxes to search a database用于搜索数据库的多个选择框
【发布时间】:2014-03-25 07:53:35
【问题描述】:

我已将带有选择框的代码更改为以下:

<html>

<head>
<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","http://www.autodeal.co.za/newsite/model-selection?ajaxmake="+‌​makevalue,true);
xmlhttp.send();
}

</script>
</head>

<body>

<?php 

$dbName = "F:/Domains/autodeal/autodeal.co.za/wwwroot/newsite/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="index.php?option=com_content&view=article&id=99" method="post" name="frm">

<select name="makeSelection" onchange="loadXMLDoc()">

<?php
//Loads the Makes from the database into a dropdown
$resultMake = odbc_exec($conn, "SELECT DISTINCT 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><br />

    <select name="modelSelection">

    </select><br />

    <select name="yearSelection">
        <option>2004</option>
        <option>2005</option>
        <option>2006</option>
        <option>2007</option>
        <option>2008</option>
        <option>2009</option>
        <option>2010</option>
        <option>2011</option>
        <option>2012</option>
        <option>2013</option>
        <option>2014</option>
    </select><br />

    <select name="priceSelection">
        <option>< 5000</option>
        <option>5000 - 20 000</option>
        <option>20 000 - 50 000</option>
        <option>50 000 - 100 000</option>
        <option>100 000 - 200 000</option>
        <option>200 000 - 300 000</option>
        <option>300 000 - 400 000</option>
        <option>400 000 - 500 000</option>
        <option>50 000 - 1 000 000</option>
        <option>> 1 000 000</option>
    </select>

<input type="submit" name="submit" value="Go">
</form>

</body>
</html>

嗨,

我已更新代码以反映下面的答案,但现在,当您进行第一次选择时,模型选择框仍为空。

modelSelection.php

<?php
        $dbName = "F:/Domains/autodeal/autodeal.co.za/wwwroot/newsite/db/savvyautoweb.mdb";

        // Throws an error if the database cannot be found
        if (!file_exists($dbName)) {
            die("Could not find database file.");
        }

        $conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", '', '');
        //loads the models based on the makes selection into a dependant dropdown
        if (isset($_REQUEST['ajaxmake'])) {

            $resultModel = odbc_exec($conn, "SELECT Model FROM Vehicle WHERE Make = '".$_REQUEST['ajaxmake']."'") or die (odbc_errormsg());

                while ($rowModel = odbc_fetch_array($resultModel)) {

                    echo "<option value='$rowModel[Model]'>$rowModel[Model]</option>";
                    die(); //I'm not sure where to put this because I assume this is the reason why this selection must be first
                }

        }

?>

【问题讨论】:

  • 首先,您应该删除此die(); 并尝试。如果您的选择仍然不是第一个,还有其他方法可以实现。
  • 看看我是否删除了它?其余选择框中的选项被转储到“模型”选择框中。

标签: php sql search odbc cascadingdropdown


【解决方案1】:

据我所知,问题在于您将整个请求响应文本加载到选择按钮中。我查看了您的请求响应,它正在响应加载模型的整个页面,所以基本上它正在获取所有选项并将它们加载到模型选择框,因为您将整个页面插入模型选择框。

您有多种选择: 你可以创建一个只加载模型选项的页面,所以有一个只有这部分的文件:

            $dbName = "F:/Domains/autodeal/autodeal.co.za/wwwroot/newsite/db/savvyautoweb.mdb";

            // Throws an error if the database cannot be found
            if (!file_exists($dbName)) {
                die("Could not find database file.");
            }

            $conn = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$dbName", '', '');
            //loads the models based on the makes selection into a dependant dropdown
            if (isset($_REQUEST['ajaxmake'])) {

                $resultModel = odbc_exec($conn, "SELECT Model FROM Vehicle WHERE Make = '".$_REQUEST['ajaxmake']."'") or die (odbc_errormsg());

                    while ($rowModel = odbc_fetch_array($resultModel)) {

                        echo "<option value='$rowModel[Model]'>$rowModel[Model]</option>";
                    }

            }

并将您通过 ajax 调用的页面更改为指向该页面:

 xmlhttp.open("GET","newpage.php?ajaxmake="+ makevalue,true);

另一种选择,我建议您使用的方法是查看一些 javascript 库,例如 jQuery,它具有简化工作的功能。

如果您包含 jQUery 库,将选择名称添加为 id="makeSelection" 和 id="modelSelection" 您可以编写一个这样的 javascript 函数:

jQuery(document).ready(function(){
     jQuery("#makeSelection").change(function(){
         jQuery("#modelSelection").load("?ajaxmake="+ makevalue + #modelSelection option");
     });
 });

顺便说一句!请注意,您的 sql 查询中可能存在巨大的安全问题,因为人们可以通过 ajaxmake 变量攻击您,并截断/删除您的表或任何东西。我建议您清理和验证来自您的请求的数据,特别是如果您在互联网上发布一些敏感数据,例如您的数据库表!!!!如果您想了解更多关于 SQL 注入的信息(这个安全问题是如何被调用的):How can I prevent SQL injection in PHP?

【讨论】:

  • 好的,我选择了你的第一个选项。我现在将模型选择代码块放在一个单独的文件中。我该怎么去打电话给xmlhttp.open("GET","modelSelection.php?ajaxmake="+ makevalue,true);,我在哪里做?我已经尝试将其添加到页面的头部。那是行不通的。 select不应该有一些函数调用吗?
  • 您基本上以与您相同的方式执行此操作,但不是调用当前页面,而是调用新页面,该页面仅显示一小段包含模型选项的 html,您将其插入模型选择与您现在相同的方式。
  • 好的,ajax 请求失败了,因为漂亮的 url,你必须给你的文件一个漂亮的 url 或者直接用完整的 url 调用它,比如:xmlhttp.open("GET","http://yoururl.com/nice/url/?ajaxmake="+makevalue,true);xmlhttp.open("GET","http://yoururl.com/file/path/modelSelection.php?ajaxmake="+makevalue,true);
  • 我使用了xmlhttp.open("GET","http://autodeal.co.za/newsite/db/modelSelection.php?ajaxmake="+‌​makevalue,true);,但它仍然无法正常工作。我更新了上面的代码
  • 我试图去你的这个页面:autodeal.co.za/newsite/db/modelSelection.php?ajaxmake=CHANGAN它不起作用,你确定路径正确还是有致命错误?它正在显示一个空白页面,但它应该显示一个
【解决方案2】:

我不确定为什么您的 ajax 处理文件中包含 html。通常您会保留一个仅包含 php 代码的 .php 文件,然后您可以确定没有包含任何 html 或脚本代码(现在您的页面中正在发生这种情况)。

首先,尝试将您的 model 下拉代码更改为:

    <?php
            //loads the models based on the makes selection into a dependant dropdown
            if (isset($_REQUEST['ajaxmake'])) {

                echo "<select name='modelSelection'>"; //select tag placed here
                $resultModel = odbc_exec($conn, "SELECT Model FROM Vehicle WHERE Make = '".$_REQUEST['ajaxmake']."'") or die (odbc_errormsg());

                    while ($rowModel = odbc_fetch_array($resultModel)) {

                        echo "<option value='$rowModel[Model]'>$rowModel[Model]</option>";
                    }

                    echo "</select><br>";
                    die(); //<-- the die placed here will not execute the rest of
                           //the code and also all the options will be populated

            }
    ?>

【讨论】:

  • 您好,上面的代码建议停止在模型选择框中显示年份和价格选择选项,但在选择后,“制造”选项仍然出现在模型选择框中。
  • @deon4110 你的代码中有太多地方需要躲避才能不打印html和脚本(如果你用开发者工具看到,你的选择框包括&lt;script&gt;和其他不应该存在的不相关代码)。就像我下面的用户建议的那样,您应该将 Model 选项 php 代码放在新页面中。
  • @I Can Has Cheezburger 那我怎么称呼它?另外,实际的 Ajax 函数是否也应该移动到新页面?
  • @deon4110 ajax 函数保留在同一页面中。只有这个 xmlhttp.open("GET","?ajaxmake="+ makevalue,true); 部分会像下面的答案一样发生变化。
  • @I Can Has Cheezburger 请查看上面的编辑代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2016-07-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多