一个语句中的多个之间

时间:2010-11-29 06:32:30

标签: php 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')"

当我运行此查询时,我收到以下错误:

您的SQL语法有错误;

  

检查对应的手册   您的MySQL服务器版本   在'AND(dateout。)附近使用正确的语法   不在'2010-11-22'之间   '2010-11-30'OD datei'在第3行

我尝试重新格式化此查询一段时间(使用()并删除 NOT BETWEEN 语句之前的语句)。最终结果始终是语法错误。运行两个之间是否存在问题?

谢谢, 莱恩

5 个答案:

答案 0 :(得分:2)

我认为你可能必须通过转储完整的sql来开始调试这种错误,并在你不明白为什么它不工作时使用mysql客户端自己尝试。

我愿意

$sql = "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')"; 

var_dump($sql);

我认为这显然是错的。

正如我在评论中所说,如果你没有逃避$room数组,这段代码会受到sql injection个漏洞的影响。您最好为reference使用一些参数化查询。加上预备语句表现更好,并且在我的诚实意见中使代码更具可读性。

答案 1 :(得分:1)

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

NOT x OR NOT y基本上与AS NOT (a AND b)相同。这个公理是De Morgan's law的一部分。因此,如果您不确定分组使用这些和其他布尔逻辑。

修改
正如其他人之前指出的那样,错误似乎是一个空洞的变量。因此,为了保证在给出空roomtyperoomnum的情况下您的查询不会中断,您可以单引引这些参数,这将导致与空字符串的比较(注意:我做不建议使用此策略。请在语句中使用之前检查变量。

答案 2 :(得分:0)

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');

答案 3 :(得分:0)

你能试试吗

"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'))"

答案 4 :(得分:0)

请使用此语法 并检查$ 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."')