Php SQL;或者语法不起作用

Php SQL;或者语法不起作用,php,mysql,Php,Mysql,好的,我有一个sql命令。请看下面 $sql = "SELECT * FROM orders WHERE loggedtime BETWEEN :time AND :times AND name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword OR jlc LIKE :keyword OR odrphone LIKE :keyword OR

好的,我有一个sql命令。请看下面

$sql = "SELECT * FROM orders 
        WHERE loggedtime BETWEEN :time AND :times 
        AND name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
        OR jlc LIKE :keyword OR odrphone LIKE :keyword 
        OR biid LIKE :keyword OR dstreet LIKE :keyword ";
$q=$con->prepare($sql);
$q->bindvalue(":keyword", "%".$keyword."%");
因此,该命令将一直工作到第一个或在其中。。。它将检查记录的时间是否与我输入的时间相同,并且名称与关键字类似

命令中唯一应该是常量的部分是
,其中loggedtime=:time
其余部分应该基于关键字是否匹配。。。但如果该顺序上的时间不正确,则不应显示任何结果。

将其放入()
loggedtime-BETWEEN:time和:times
,因此您的查询应为:

$sql = "SELECT * FROM orders 
WHERE (loggedtime BETWEEN :time AND :times) 
AND name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
OR jlc LIKE :keyword OR odrphone LIKE :keyword 
OR biid LIKE :keyword OR dstreet LIKE :keyword ";

如您所述,有两个主要条件被视为
记录的时间
和与
关键字
相比的其他字段
您需要使用大括号对逻辑相关的运算符进行分组
组合这些条件(以及条件和或条件)时,使用圆括号很重要,以便数据库知道评估每个条件的顺序
尝试此查询:

$sql = "SELECT * FROM orders 
        WHERE loggedtime BETWEEN :time AND :times 
        AND (name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
        OR jlc LIKE :keyword OR odrphone LIKE :keyword 
        OR biid LIKE :keyword OR dstreet LIKE :keyword) ";

逻辑
运算符的优先级高于逻辑
。这在中有详细的记录

因此,如果没有显式大括号,当前语句实际上如下所示:

SELECT * FROM orders 
    WHERE (loggedtime BETWEEN :time AND :times 
    AND name LIKE :keyword) OR odryname LIKE :keyword OR pdryname LIKE :keyword 
    OR jlc LIKE :keyword OR odrphone LIKE :keyword 
    OR biid LIKE :keyword OR dstreet LIKE :keyword
由于
的优先级低于
,因此需要大括号将所有
ed条件组合在一起:

SELECT * FROM orders 
    WHERE loggedtime BETWEEN :time AND :times 
    AND (name LIKE :keyword OR odryname LIKE :keyword OR pdryname LIKE :keyword 
    OR jlc LIKE :keyword OR odrphone LIKE :keyword 
    OR biid LIKE :keyword OR dstreet LIKE :keyword)

在同一查询中组合AND和OR时,请确保您了解评估这些查询的规则,并在适当的情况下应用括号。。。。喜欢(威士忌或比萨饼)和板球与喜欢威士忌或(比萨饼和板球)…或更好。一般来说,为了让事情更清楚,我建议总是将包含AND∨即使你知道评估的顺序:阅读时,你的大脑要分析的东西少了一件,当你稍后再讨论时,你更容易记住/阅读你的意图。@MarkBaker,这很有效,我现在理解使用括号来做这件事。非常感谢。请张贴一个答案,这样我可以接受。