"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 语句之前的语句)。最终结果始终是语法错误。运行两个之间是否存在问题?
谢谢, 莱恩
答案 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的一部分。因此,如果您不确定分组使用这些和其他布尔逻辑。
修改强>
正如其他人之前指出的那样,错误似乎是一个空洞的变量。因此,为了保证在给出空roomtype
或roomnum
的情况下您的查询不会中断,您可以单引引这些参数,这将导致与空字符串的比较(注意:我做不建议使用此策略。请在语句中使用之前检查变量。
答案 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."')