簡體   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