处理 AND、OR 以及"any values"的结果查询



我有一个带有表单的搜索页面,用户可以在其中为 2 个不同的字段(名称和城市(设置值。它工作正常,但对于这两个字段,当用户只想要该城市的结果时,可以选择"ANY"作为其中一个选项。但是如果他们选择 ANY,他们将得到 0 个结果,因为我的查询是 AND 查询。我不知道如何构造此查询,因此如果他们为第二个字段选择 ANY,它会显示两个值的结果或仅显示一个值的结果。我不能使用"OR",因为他们可能也希望获得城市中特定名称的结果。允许所有选项的最佳查询是什么?

 <?
 //Connection
 $name = $_GET['name'];
 $city = $_GET['city'];

 $link = mysqli_connect($dbhost, $dbuser, $dbpass) or die('MySQL 
 error:'.mysql_error());
 mysqli_select_db($link, $dbname) or die('MySQL error:'.mysql_error());
 $query = "(SELECT * FROM people where name='$name' and city='$city')";
 $result = mysqli_query($link, $query);
 $num_rows = mysqli_num_rows($result);
 echo "$num_rows Rowsn";
 echo "<table border='1'>
 <tr>
 <th>School</th>
 <th>City</th>
 </tr>";
 /* fetch associative array */
 while ($row = mysqli_fetch_assoc($result)) {
 echo "<tr>";
 echo "<td>" . $row['name'] . "</td>";
 echo "<td>" . $row['city'] . "</td>";
 echo "</tr>";
 }
 /* free result set */
 mysqli_free_result($result);
 echo "</table>";
 mysqli_close($link);
 ?> 

试试这个:

$query = "(SELECT * FROM people where (name='$name' or '$name' = 'ANY') and (city='$city' or '$city' = 'ANY')";

更新

对不起,这是 ANY 周围的引号。 试试这个:

$query = "(SELECT * FROM people where (name='$name' or '$name' = 'ANY') and (city='$city' or '$city' = 'ANY')";

-或-

$query = "(SELECT * FROM people where (name='$name' or '$name' = \'ANY\') and (city='$city' or '$city' = \'ANY\')"

取决于可能发生的其他逃跑。

还要注意代码注入,希望那些用户输入的字符串已经使用 mysqli_real_escape_string(( 之类的东西进行了转义。

我希望这有所帮助。

请尝试

以下操作:

$query = "(SELECT * FROM people where name =  case  '$name' when 'ANY' then name else '$name' end and city= case '$city' when 'ANY' then city else '$city' end)";

请看这个演示并翻译成php代码

http://rextester.com/live/XSPV71393

SELECT
  *
FROM mytable
WHERE name_ LIKE (CASE
  WHEN @searchname = 'any' THEN '%%'
  ELSE concat('%', @searchname, '%')
END)
AND city LIKE (CASE
  WHEN @searchcity = 'any' THEN '%%'
  ELSE concat('%', @searchcity, '%')
END);

所以PHP代码应该是这样的

$query = "SELECT  * FROM mytable WHERE name_ LIKE (CASE   WHEN ".$name." = 'any' THEN '%%'   ELSE concat('%', ".$name.", '%') END) AND city LIKE (CASE   WHEN ".$city." = 'any' THEN '%%'  ELSE concat('%',".$city"., '%') END);";

最新更新