MySQL查询忽略published='1'条件,结果不符合预期求助
解决MySQL查询忽略
published='1'条件的问题 这问题我太熟了!核心原因是MySQL运算符的优先级在搞鬼——AND的优先级比OR高,所以你的查询实际执行逻辑是这样的:
SELECT * FROM news WHERE (published='1' AND title LIKE '%$q%') OR details LIKE '%$q%' ORDER BY id DESC
也就是说,只要details匹配了%$q%,不管published是不是1,这条记录都会被返回,这就完全绕过了你想要的published='1'过滤条件。
修正方案
你需要把两个LIKE条件用括号括起来,让published='1'同时作用于这两个匹配条件,确保只有已发布(published='1')的记录才会被筛选:
SELECT * FROM news WHERE published='1' AND (title LIKE '%$q%' OR details LIKE '%$q%') ORDER BY id DESC
这样查询逻辑就变成了:必须满足published='1',同时满足title匹配或者details匹配,完全符合你的需求。
重要提醒:SQL注入风险
另外必须说一句,你直接把变量$q拼进SQL语句里是非常危险的,这会导致严重的SQL注入漏洞。建议你改用预处理语句(比如PDO或者mysqli的prepare方法)来绑定参数,示例(以PDO为例):
$stmt = $pdo->prepare("SELECT * FROM news WHERE published='1' AND (title LIKE :q OR details LIKE :q) ORDER BY id DESC"); $searchTerm = "%$q%"; $stmt->bindParam(':q', $searchTerm); $stmt->execute(); $results = $stmt->fetchAll();
这种方式能有效避免SQL注入,让你的代码更安全。
内容的提问来源于stack exchange,提问作者OLM256
相关产品推荐
相关产品推荐

