Php 一条语句中的多个中间值

Php 一条语句中的多个中间值,php,sql,mysql,Php,Sql,Mysql,运行此查询时,出现以下错误: 您的SQL语法有错误 检查相应的手册 您的MySQL服务器版本 使用near'和(dateout)的正确语法 不在“2010-11-22”和 第3行的“2010-11-30”或“datei” 我尝试重新格式化此查询已有一段时间了(使用()并删除而不是之间的语句之前的语句)。最终结果总是语法错误。运行两个中间语句是否有问题 谢谢, RyanRageZ可能是对的-改写如下: "SELECT * FROM reservation WHERE roomnum = {$ro

运行此查询时,出现以下错误:

您的SQL语法有错误

检查相应的手册 您的MySQL服务器版本 使用near'和(dateout)的正确语法 不在“2010-11-22”和 第3行的“2010-11-30”或“datei”

我尝试重新格式化此查询已有一段时间了(使用()并删除而不是之间的语句之前的语句)。最终结果总是语法错误。运行两个中间语句是否有问题

谢谢,
Ryan

RageZ可能是对的-改写如下:

"SELECT * FROM reservation  WHERE roomnum = {$room['roomnum']} 
AND roomtype = {$room['roomtype']} 
AND (dateout NOT BETWEEN '$start' AND '$end' 
OR datein NOT BETWEEN '$start' AND '$end')"

RageZ可能是对的-重写如下:

"SELECT * FROM reservation  WHERE roomnum = {$room['roomnum']} 
AND roomtype = {$room['roomtype']} 
AND (dateout NOT BETWEEN '$start' AND '$end' 
OR datein NOT BETWEEN '$start' AND '$end')"
拥有
非x或非y
本质上与
非(a和b)
相同。这一公理是其中的一部分。因此,如果您不确定分组,请使用这些逻辑和其他布尔逻辑

编辑
正如前面其他人指出的,错误似乎是一个空变量。因此,为了确保在给定空
roomtype
roomnum
时查询不会中断,您可以单引号引这些参数,这将导致与空字符串进行比较(注意:我不推荐这种策略。在语句中使用变量之前,请检查变量)

拥有
非x或非y
本质上与
非(a和b)
相同。这一公理是其中的一部分。因此,如果您不确定分组,请使用这些逻辑和其他布尔逻辑

编辑
正如前面其他人指出的,错误似乎是一个空变量。因此,为了确保在给定空
roomtype
roomnum
时查询不会中断,您可以单引号引这些参数,这将导致与空字符串进行比较(注意:我不推荐这种策略。在语句中使用变量之前,请检查它们)。

您能试试吗

  SELECT *
    FROM reservation
   WHERE roomnum = {$room['roomnum']} 
     AND roomtype = {$room['roomtype']} 
 AND NOT ( datein BETWEEN '$start' AND '$end' 
     AND   dateout BETWEEN '$start' AND '$end' )
你能试试这个吗

  SELECT *
    FROM reservation
   WHERE roomnum = {$room['roomnum']} 
     AND roomtype = {$room['roomtype']} 
 AND NOT ( datein BETWEEN '$start' AND '$end' 
     AND   dateout BETWEEN '$start' AND '$end' )
请使用此语法 并检查$room['roomtype']是否为空

"SELECT * FROM reservation WHERE roomnum = {$room['roomnum']} AND roomtype = {$room['roomtype']} AND ((dateout NOT BETWEEN '$start' AND '$end') OR (datein NOT BETWEEN '$start' AND '$end'))"
请使用此语法 并检查$room['roomtype']是否为空

"SELECT * FROM reservation WHERE roomnum = {$room['roomnum']} AND roomtype = {$room['roomtype']} AND ((dateout NOT BETWEEN '$start' AND '$end') OR (datein NOT BETWEEN '$start' AND '$end'))"

我认为您可能必须通过转储完整的sql来调试这种错误,并在不理解为什么不能工作时使用mysql客户机亲自尝试

我愿意

SELECT * FROM reservation 
WHERE roomnum = '".$room['roomnum']."' AND roomtype = '".$room['roomtype']."'  
AND (dateout NOT BETWEEN '".$start."' AND '".$end."' OR datein NOT BETWEEN '".$start."' AND '".$end."')
我认为很明显,问题出在哪里


另外,正如我在评论中所说的,如果你不逃离
$room
数组,这段代码就会受到漏洞的影响。你最好使用一些参数化查询,因为你的.Plus prepared语句执行得更好,并且在我看来,使代码更具可读性。

我认为你可能必须开始调试这类代码f错误,转储完整的sql,当您不明白为什么它不工作时,请使用mysql客户端亲自尝试

我愿意

SELECT * FROM reservation 
WHERE roomnum = '".$room['roomnum']."' AND roomtype = '".$room['roomtype']."'  
AND (dateout NOT BETWEEN '".$start."' AND '".$end."' OR datein NOT BETWEEN '".$start."' AND '".$end."')
我认为很明显,问题出在哪里


另外,正如我在评论中所说的,如果你不避开
$room
数组,这段代码就会受到漏洞的影响。你最好使用一些参数化查询,因为你的.Plus prepared语句执行得更好,并且在我的诚实意见中使代码更具可读性。

很可能是因为$room['roomtype']是空的。此SQL错误
roomtype=和
,mysql在
=
之后等待一些东西。如果您可以将查询分配给变量并打印它,它将帮助我们更好地调试。另外,我不太确定,但您的代码似乎会受到SQL注入的影响……您可能希望开始使用参数化SQL查询。请发布如果你想得到一个明确的答案而不是大量的猜测,那么在变量值被替换到SQL中之后的查询。@Mark Byers:当他得到简单的SQL时-他将能够自己解决这个问题;-)现在的问题是关于调试“艺术”:-)很可能是因为$room['roomtype']是空的。此SQL错误
roomtype=和
,mysql在
=
之后等待一些东西。如果您可以将查询分配给变量并打印它,它将帮助我们更好地调试。另外,我不太确定,但您的代码似乎会受到SQL注入的影响……您可能希望开始使用参数化SQL查询。请发布如果你想得到一个明确的答案而不是大量的猜测,那么在变量值被替换到SQL中之后的查询。@Mark Byers:当他得到简单的SQL时-他将能够自己解决这个问题;-)现在的问题是关于调试“艺术”:)以及这将如何帮助处理不存在的变量?再加一个大括号将神奇地为$room['roomtype']?;-)带来一些价值这里也一样;-)一个好的
var\u dump($sql)
将不会有任何帮助,关键是隔离第一个子句,以防止语法错误。根据OP的例子,修复逻辑有点超出范围……这将如何帮助修复不存在的变量?再加一个大括号将神奇地为$room['roomtype']?;-)带来一些价值这里也一样;-)一个好的
var\u dump($sql)
将不会有任何帮助,关键是隔离第一个子句,以防止语法错误。根据OP的例子,修复逻辑有点超出范围…有没有使用此语法的原因?有没有使用此语法的原因?是的,你是对的,但他问使用多个
中间的
是否会导致错误。正如你可能会同意的那样,上面的语句是完全合法的,这反过来会向OP表明他的错误是在参数中发现的,而不是在语句本身。是的,但他问这个问题,因为他不知道如何调试。因此,在这些情况下,我更愿意回答实际问题,这将有助于OP获得工作代码,而不管问题是否错误;-)是的,你是对的,但他问在两个
之间使用多个
是否会导致错误。正如你可能会同意的那样,上述声明是完全合法的