You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中MySQL AND运算符失效:实时筛选未过滤已删除数据

问题分析与解决方案

你遇到的问题是运算符优先级导致的!在SQL里,AND(或者你用的&&)的优先级比OR高,所以你的原语句其实相当于:

select * from project 
where (name LIKE '%$text%') 
   or (type LIKE '%$text%') 
   or (sector LIKE '%$text%') 
   or (city LIKE '%$text%') 
   or (builder LIKE '%$text%' AND status='1') 
LIMIT 6

看到没?status='1'只和最后一个builder LIKE...绑定了,前面几个OR的条件根本不受status限制,所以那些status=0的数据只要匹配前面任意一个LIKE条件就会被查出来。

修复后的SQL语句

把所有需要OR连接的模糊查询条件用括号括起来,再和status='1'用AND连接,这样就能确保所有返回的结果都满足status='1',同时匹配任意一个模糊查询条件:

$text = $_POST['text'];
// 用括号包裹OR条件,同时使用SQL标准的AND替代&&
$result = mysqli_query($conn,"select * from project where 
    (name LIKE '%$text%' or type LIKE '%$text%' or sector LIKE '%$text%' or city LIKE '%$text%' or builder LIKE '%$text%') 
    AND status='1' 
LIMIT 6");

重要安全提醒

另外,你现在直接把$_POST['text']拼进SQL语句里,存在严重的SQL注入风险!作为PHP初学者,一定要养成使用预处理语句的习惯,这能有效避免注入攻击。给你一个更安全的写法示例:

$text = "%".$_POST['text']."%";
// 初始化预处理语句
$stmt = $conn->prepare("select * from project where 
    (name LIKE ? or type LIKE ? or sector LIKE ? or city LIKE ? or builder LIKE ?) 
    AND status='1' 
LIMIT 6");
// 绑定5个字符串类型的参数
$stmt->bind_param("sssss", $text, $text, $text, $text, $text);
// 执行查询
$stmt->execute();
// 获取结果集
$result = $stmt->get_result();

这样既解决了你的筛选条件问题,又提升了代码的安全性~

内容的提问来源于stack exchange,提问作者Inderjeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:53:52