【问题标题】:Multiple Search Criteria in PHP and MySqlPHP 和 MySql 中的多个搜索条件
【发布时间】:2014-04-03 20:19:57
【问题描述】:

我正在开发一家汽车经销商网站。该经销商使用第三方桌面应用程序来管理库存和在售车辆。此第三方应用程序将车辆数据保存到访问数据库 (.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!");
      }

  ?>

如何让消息出现?

编辑:查询现在可以工作,它会根据所做的选择显示被删除的结果,但必须进行所有选择,否则它不会显示任何内容。

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

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

【问题讨论】:

  • 添加斜杠?!?请雇人。
  • 如果你打印出那个sql语句,它会说什么? echo "\n\n$sql\n\n"; 。您可以将其添加到您的问题中吗?
  • @bobkingof12vs 我已经编辑了问题。
  • @deon4110 我更希望在构建查询后看到$sql 的设置。您可以在运行代码时发布echo "\n\n$sql\n\n" 的结果吗?对不起,如果我没有意义
  • 这是正在打印的内容:SELECT Id, Make, Model, Year, Price, SpecialPrice, Branch, StockNO FROM Vehicle WHERE Price &gt;= 50000 AND Price &lt;= 900000 AND Make LIKE 'searchMake' AND Model LIKE 'searchModel' AND Branch LIKE 'EAST_RAND' AND Year LIKE '2011'

标签: php sql multiple-columns advanced-search


【解决方案1】:

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

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 条件匹配时,你才会得到结果 - 即。如果用户输入 Make="Ford" 和 Model="Civic" - 你将一无所获。这可能是您希望它工作的方式,或者您可能希望它返回所有福特和所有本田思域的列表。

最后,关于@Dagon 上述评论的主题 - 您应该考虑使用参数进行查询。这将消除使用 addslashes 之类的函数的需要,并且还可以保护您免受 SQL 注入。

【讨论】:

  • 用户不能选择 Ford 作为品牌,然后选择 Civic 作为模型,因为我已经实现了级联选择框。因此,品牌框从数据库中获取信息,而型号框从数据库中获取与品牌框中信息相关的信息。因此,如果您选择福特,您将只能选择 Fiesta、Focus 或 Ranger 等。
  • 但是如果用户只选择一个品牌,或者一个品牌和年份,则必须打印相关信息。例如我选择福特和 2012 年,所有可能的福特都必须打印,只有 2012 年,无论是嘉年华还是福克斯或其他。与其他盒子类似。但是,您必须选择一个品牌。
  • 顺便说一句,如果我删除除品牌和年份选择框之外的所有内容,搜索查询将按预期工作 100%。但不幸的是,这不是我的客户想要的。如果只是!
  • 这一切都取决于您的 SQL 语法 - 构建一些适用于一堆不同输入组合的查询,然后考虑如何在代码中构建这些查询。
  • 我创建了一个包含品牌、型号、分支和年份的查询,并显示了所需的结果。似乎价格范围的sql结构是这里的问题。
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多