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
相关产品推荐
相关产品推荐

