首页 > 解决方案 > php搜索过滤器显示所有行而不过滤

问题描述

在显示过滤后的数据时,该 sql 可以按照 $locationone 和 $locationtwo 过滤数据。

但它未能按照$cate过滤数据

我的意思是它显示来自两个位置的所有行并且未能根据科学(主题)过滤它

$cat= "science";
$cate= preg_replace("#[^0-9a-z]#i","", $cat);
$locationone= "dhk";
$locationtwo= "ctg";
preg_replace("#[^0-9a-z]#i","", $locationone);
preg_replace("#[^0-9a-z]#i","", $locationtwo);
$sql= "SELECT * FROM post INNER JOIN user ON post.user_id= user.id
WHERE post.topic LIKE '%$cate%'
AND post.location LIKE '%$locationone%' 
OR post.location LIKE '%$locationtwo%'
order by post_id desc";

标签: phpmysql

解决方案


逻辑运算符OR的优先级低于AND。所以你需要OR用括号括起来 ed 条件:

WHERE 
    post.topic LIKE '%$cate%'
    AND (post.location LIKE '%$locationone%' OR post.location LIKE '%$locationtwo%')

没有括号,您的代码相当于:

WHERE 
    (post.topic LIKE '%$cate%' AND post.location LIKE '%$locationone%')
    OR post.location LIKE '%$locationtwo%'

在这里,您可以看到此代码将允许位置'locationtwo'topic.

重要提示:您确实希望在代码中的任何地方都使用准备好的语句和参数化查询,以确保安全性和效率。请参阅这篇文章了解如何进行。


推荐阅读