0

我是 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);
?>

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

4

2 回答 2

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 之后就可以了,这样您就不必担心在 where 语句前面是否需要 AND 进行测试,并且它不会改变您的查询结果。

于 2012-07-26T21:19:00.160 回答
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 注入的攻击

为了防止这种情况发生,您应该检查您的输入是否有任何数据并根据它们是否包含您的某些值来构建查询,或者是否使用某些 SQL 框架(可能是 Zend_Db)或转义变量的值。

于 2012-07-26T21:17:31.560 回答