2014-04-03 25 views
0

我正在汽車經銷商網站上工作。該經銷商使用第三方桌面應用程序來管理庫存和出售的車輛。此第三方應用程序將車輛數據保存到Access數據庫(.mdb)。我成功連接到這個數據庫,以及查看單個記錄等等。所有這一切都很好。PHP和MySql中的多重搜索條件

拼圖的最後一部分是高級搜索條件。這個搜索標準有六個輸入;品牌,型號(品牌和型號輸入是文本,它們也是使用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!"); 
     } 

    ?> 

我該如何讓消息出現?

編輯:查詢工作,現在,它顯示根據所做的選擇的derisred結果,但所有的選擇都必須作出否則不顯示任何內容。

請注意品牌必須被選中。它不可能是所有品牌。否則,您可以查看整個表格。

我怎樣才能構建上面的查詢有一個「全模式」和「任何一間分行」和「任何一年」和「任何代價」作爲有效的選擇?

+0

addslashes?!?請聘請一個人。 –

+0

如果你打印出這條sql語句,它說什麼? 'echo「\ n \ n $ sql \ n \ n」; '。你可以添加到你的問題? – bobkingof12vs

+0

@ bobkingof12vs我編輯了這個問題。 – Deon

回答

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. 您可以爲任何值提供合理的默認值,用戶可以省略任何值,並將所有值(如「所有模型」)替換爲與數據庫中所有值匹配的值。

現在,關於如何獲得預期結果的問題:考慮如何搜索。你得到它的方式,你只會得到結果,如果所有條件匹配 - 即。如果用戶進入Make =「Ford」和Model =「Civic」 - 你什麼也得不到。這可能是您希望它工作的方式,或者您可能希望它返回所有Fords和所有本田思域的列表。

最後,關於@ Dagon上面評論的主題 - 您應該查看使用參數進行查詢。這將消除使用諸如addslashes之類的功能的需要,並且還將保護您免受SQL注入。

+0

用戶將無法選擇Ford作爲品牌,然後選擇Civic作爲模型,因爲我已經實施了級聯選擇框。因此,品牌箱從數據庫獲取信息,模型箱從數據庫獲取與品牌箱中信息相關的信息。所以如果你選擇福特,你只能選擇嘉年華,或者聚焦或遊俠等等。 – Deon

+0

但是,這種方式的工作方式是,如果用戶只選擇品牌或品牌和年份,則必須打印該信息。對於例如我選擇福特和2012年,只有2012年所有可能的福特必須印刷,無論是嘉年華還是焦點或其他。與其他盒子類似。但是,你必須選擇一個品牌。 – Deon

+0

順便說一句,如果我刪除除品牌和年份選擇框以外的所有內容,則搜索查詢將按預期工作100%。但不幸的是,這不是我的客戶想要的。要是! – Deon