SQL没有正确过滤某些条件

时间:2013-11-18 19:12:07

标签: php mysql sql

我的MySQL查询遇到了一些麻烦:

$statement = $conn->prepare
("SELECT * FROM ext where `approved` = 0 
and `account-type`= 2 
AND `ext-name` LIKE :search OR description LIKE :search");

查询的LIKE部分有效 - 它确实返回与正确关键字对应的条目。但是,它返回的条目是每account-type个 - 它不会过滤到只有account-type为2的条目。

我感觉这是我在使用SQL语句时出错了,但是如果它与我的PHP有关,那么这里是完整的代码片段:

    $statement = $conn->prepare("SELECT * FROM ext where `approved` = 0 and `account-type`= 2 AND `ext-name` LIKE :search OR description LIKE :search");
    $statement->bindValue(':search', "%{$keyword}%");
    $statement->execute();

    $exchanges = $statement->fetchAll();

3 个答案:

答案 0 :(得分:7)

使用括号:

SELECT * FROM ext 
where `approved` = 0 and `account-type`= 2 
AND (`ext-name` LIKE :search OR description LIKE :search)

答案 1 :(得分:1)

可能你错过了最后一行的括号:

AND `ext-name` LIKE :search OR description LIKE :search"

如果没有它们,查询将返回与description LIKE :search匹配的所有行。

这是典型的错误 - 如果查询没有返回您的预期,并且您的OR中有{{1}} 查询你可能会错过一些括号。

答案 2 :(得分:1)

您应该使用大括号来表达您想要的优先级。

你可能意味着:

SELECT * FROM ext where `approved` = 0 
 and `account-type`= 2 
 AND (`ext-name` LIKE :search OR description LIKE :search )

但实际上条件是这样评估的:

SELECT * FROM ext 
where ( `approved` = 0  and `account-type`= 2 AND `ext-name` LIKE :search )
 OR description LIKE :search