我正在汽车经销商网站上工作。该经销商使用第三方桌面应用程序来管理库存和待售车辆。此第三方应用程序将车辆数据保存到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!");
}
?>
如何显示消息?
编辑:查询现在可以正常运行,它会根据所做的选择显示受到破坏的结果,但必须进行所有选择,否则它不会显示任何内容。
请记住,必须选择品牌。它不可能是所有品牌。否则你只能查看整个表格。
如何构建上述查询以将“所有模型”和“任何分支”以及“任何年份”和“任何价格”作为有效选择?
答案 0 :(得分: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'
(我打破了查询,使其更容易阅读)。
现在问问自己:&#34;如果$minPrice
为空,会发生什么?&#34;?生成的查询将如下所示:
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:你会收到错误。类似的事情可以&amp;将以这种方式插入所有其他值。
此外,我从您的错误消息中注意到您正在搜索--All Models--
等值。有可能,库存中没有带有该名称的模型。如果你想处理这样的值,你需要在将它们提交到数据库之前在代码中调整它们。
您可以通过多种方式处理构建查询:
WHERE
子句列表,或者现在,关于如何获得您期望的结果的问题:考虑您想要搜索的方式。你获得它的方式,只有当所有条件匹配时才会得到结果 - 即。如果用户输入Make =&#34; Ford&#34;和模型=&#34;思域&#34; - 你什么也得不到。这可能是你希望它工作的方式,或者你可能希望它返回所有Fords和所有Honda Civics的列表。
最后,关于@ Dagon上面评论的主题 - 您应该考虑使用参数进行查询。这将消除使用addslashes
等函数的需要,并且还可以保护您免受SQL注入。