[英]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--
類的值。 很有可能,庫存中沒有使用該名稱的模型。 如果要處理類似的值,則需要先在代碼中對其進行調整,然后再將其提交給數據庫。
您可以通過以下兩種方法來構建查詢:
WHERE
子句的列表,或者 現在,關於如何獲得期望的結果的問題:考慮如何搜索。 實現方式,只有在所有條件都匹配的情況下,您才能獲得結果-即。 如果用戶輸入Make =“ Ford”和Model =“ Civic”-您將一無所獲。 這可能是您希望它工作的方式,或者您可能希望它返回所有福特和所有本田思域的列表。
最后,關於上面@Dagon的注釋,您應該研究使用參數進行查詢。 這將消除對使用諸如addslashes
功能的需求,還將保護您免受SQL注入的侵害。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.