保留为null时,会出现多个下拉菜单查询结果

时间:2012-07-26 21:09:07

标签: php mysql sql drop-down-menu

我是php的新手,我遇到了问题。

我有三个下拉菜单来排序结果,但我想这样做,如果他们不选择任何东西,默认是SELECT * FROM餐厅,如果只选择一个下拉菜单只考虑该字段。

<form id="form" name="vicinity" method="post" action="restaurant-list.php">
   <select class="form-banner" size="1" id="vicinity" name="vicinity">
      <option value=""> Select one </option>
      <option value="Back Bay">Back Bay</option>
      <option value="Beacon Hill">Beacon Hill</option>
      <option value="Chinatown">Chinatown</option>
   </select><br><br>
   <p class="font-2">Search by Cuisines</p>
   <select class="form-banner" size="1" id="cuisine" name="cuisine">
      <option value=""> Select one </option>
      <option value="American">American</option>
      <option value="Chinese">Chinese</option>
      <option value="Indian">Indian</option>
   </select><br><br>
   <p class="font-2">Search by Price</p>
   <select class="form-banner" size="1"  id="price" name="price">
      <option value=""> Select one </option>
      <option value="$">$ - Cheap</option>
      <option value="$$">$$ - Moderate</option>
      <option value="$$$">$$$ - Pricey</option>
   </select><br><br>
   <input type="submit" id="banner-search" value="Search"/>
</form>

餐厅页面(目前仅在选择所有字段时有效)如果一个空白,则不显示任何内容。

<?php
require ("db.php");
$vicinity = $_POST["vicinity"];
$cuisine = $_POST["cuisine"];
$price = $_POST["price"];

$query = "SELECT * FROM restaurant WHERE vicinity=\"$vicinity\" AND cuisine=\"$cuisine\" AND price=\"$price\"";
$result = mysql_query($query);
?>

任何帮助或想法如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

当然,在您的PHP代码中执行此操作:(编辑以显示防止注入的一个步骤)

<?php
require ("db.php");
$vicinity = mysql_real_escape_string($_POST["vicinity"]);
$cuisine = mysql_real_escape_string($_POST["cuisine"]);
$price = mysql_real_escape_string($_POST["price"]);

$query = "SELECT * FROM restaurant WHERE 1=1 ";
if($vicinity) $query .= "AND vicinity=\"$vicinity\" ";
if($cuisine)  $query .= "AND cuisine=\"$cuisine\" ";
if($price)    $query .= "AND price=\"$price\"";
$result = mysql_query($query);
?>

将1 = 1置于其后的位置,这样您就不必担心测试是否需要在where语句前面使用AND而不会更改查询结果。

答案 1 :(得分:0)

如果您的SQL数据库支持LIKE语句,那么应该这样做。

<?php
require ("db.php");
$vicinity = $_POST["vicinity"];
$cuisine = $_POST["cuisine"];
$price = $_POST["price"];

$query = "SELECT * FROM restaurant WHERE vicinity LIKE \"%$vicinity%\" AND cuisine LIKE \"%$cuisine%\" AND price LIKE \"%$price\%"";
$result = mysql_query($query);
?>

请注意,你很容易受到SQL Injection

的攻击

为了防止这种情况,你应该检查你的输入是否有任何数据并构建查询,具体取决于它们是否包含某些值,或者不包含某些SQL Framework(可能是Zend_Db)或者转义变量的值。