繁体   English   中英

PHP和MySql中的多个搜索条件

[英]Multiple Search Criteria in PHP and MySql

我正在汽车经销商网站上。 该经销商使用第三方桌面应用程序来管理库存和待售车辆。 该第三方应用程序将车辆数据保存到Access数据库(.mdb)。 我成功连接到该数据库,并查看了各个记录等。 到目前为止,一切都很好。

难题的最后一部分是高级搜索条件。 此搜索条件有六个输入; 品牌,型号(品牌和型号输入是文本,并且它们也使用AJAX进行级联下拉),分支,年份(文本),最低价格和最高价格(两个价格输入是数据库中数字数据类型)。

用户很可能不会使用所有可用的输入,因为通常情况下,它们不会产生任何结果。

同样,如果搜索在这之后仍然有效,并且有人在搜索某项但数据库中某项不可用,则必须出现一条消息,通知用户所请求的车辆当前不可用。 我将如何去做这样的事情?

到目前为止,这是我的代码。

<?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", '', '');

      if (isset($_REQUEST['submit'])) {
        $searchMake = addslashes($_POST['makeSelection']);
        $searchModel = addslashes($_POST['modelSelection']);
        $searchBranch = addslashes($_POST['branchSelection']);
        $searchYear = addslashes($_POST['yearSelection']);
        $minPrice = addslashes($_POST['minPriceSelection']);
        $maxPrice = addslashes($_POST['maxPriceSelection']);

        $sql = "SELECT Id, Make, Model, Year, Price, SpecialPrice, Branch, StockNO FROM Vehicle WHERE Price BETWEEN $minPrice AND $maxPrice AND Make LIKE '$searchMake' AND Model LIKE '$searchModel' AND Year LIKE '$searchYear' AND Branch LIKE '$searchBranch'";
        $rs = odbc_exec($conn, $sql);


      //} else {
        //$sql = "SELECT Id, Make, Model, Year, Price, SpecialPrice, Branch, StockNO FROM Vehicle ORDER BY Make";
        //$rs = odbc_exec($conn, $sql) or die (odbc_errormsg());

      }   



          echo "\t" . "<tr>\n";

              echo "\t" . "<th>Make</th><th>Model</th><th>Year</th><th>Price</th><th>Special Price</th><th>Location</th><th>Stock Number</th>" . "\n";

                  while (odbc_fetch_row($rs)) { 
                      $id = odbc_result($rs, Id);
                      $make = odbc_result($rs, Make);
                      $model = odbc_result($rs, Model);
                      $year = odbc_result($rs, Year);
                      $price = odbc_result($rs, Price);
                      $specialPrice = odbc_result($rs, SpecialPrice);
                      $branch = odbc_result($rs, Branch);
                      $stockNo = odbc_result($rs, StockNO);

                          echo "\t" . "<tr>\n";
                              echo "\t\t" . "<td>" . $make . "</td><td><a href=/newsite/selected-vehicles?Id=$id>" . $model . "</a></td><td>" . $year . "</td><td>" . $price . "</td><td>" . $specialPrice . "</td><td>" . $branch . "</td><td>" . $stockNo . "</td>\n";

                          echo "\t" . "</tr>\n";
                  }

      odbc_free_result($rs);
      odbc_close($conn);

      // This message is displayed if the query has an error in it
      if (!$rs) {
          exit("There is an error in the SQL!");
      }

  ?>

我如何使消息出现?

编辑:该查询现在工作,并根据选择显示已拒绝的结果,但是必须进行所有选择,否则将不显示任何内容。

请记住,必须选择品牌。 不可能是所有品牌。 否则,您只能查看整个表格。

如何构造上述查询,以将“所有模型”,“任何分支机构”,“任何年份”和“任何价格”作为有效选择?

您需要考虑所有可能的输入组合,以及这将如何影响发送到数据库的查询。 例如,您的查询是通过以下方式构造的:

SELECT Id, Make, Model, Year, Price, SpecialPrice, Branch, StockNO
FROM Vehicle
WHERE 
    Price >= $minPrice AND
    Price <= $maxPrice AND
    Make LIKE 'searchMake' AND
    Model LIKE 'searchModel' AND
    Branch LIKE '$searchBranch'
    AND Year LIKE '$searchYear'

(我对查询进行了细分,使其更易于阅读)。

现在问问自己:“如果$minPrice为空,会发生什么?” 结果查询将如下所示:

SELECT Id, Make, Model, Year, Price, SpecialPrice, Branch, StockNO
FROM Vehicle
WHERE 
    Price >=  AND
    Price <= 100 AND
    Make LIKE 'something' AND
    Model LIKE 'something' AND
    Branch LIKE 'something'
    AND Year LIKE 'something'

那是无效的SQL:您会得到一个错误。 以这种方式插入的所有其他值可能也会发生类似的情况。

另外,我从您的错误消息中注意到,您正在搜索--All Models--类的值。 很有可能,库存中没有使用该名称的模型。 如果要处理类似的值,则需要先在代码中对其进行调整,然后再将其提交给数据库。

您可以通过以下两种方法来构建查询:

  1. 您可以以这样的方式编写代码,使其基于用户提供的值来重建WHERE子句的列表,或者
  2. 您可以为用户忽略的任何值提供合理的默认值,并使用与数据库中所有值匹配的值替换“ All Models”之类的任何值。

现在,关于如何获得期望的结果的问题:考虑如何搜索。 实现方式,只有在所有条件都匹配的情况下,您才能获得结果-即。 如果用户输入Make =“ Ford”和Model =“ Civic”-您将一无所获。 这可能是您希望它工作的方式,或者您可能希望它返回所有福特和所有本田思域的列表。

最后,关于上面@Dagon的注释,您应该研究使用参数进行查询。 这将消除对使用诸如addslashes功能的需求,还将保护您免受SQL注入的侵害。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM