检查房间是否免费(教室预订)

时间:2014-06-04 17:05:44

标签: php mysql

首先,请原谅我英语不好。我试图选择所有尚未预订的房间。查询似乎在大多数时间都有效,但有时会显示已在预定时间内预订的房间。

//Example input:
//$date = 2014-06-04;
//$begintime = 09:30;
//$endtime = 12:00;

$query = $mysqli->query("
    SELECT *
    FROM room
    WHERE room.id NOT IN  (
                            SELECT room_id
                            FROM reservation
                            WHERE reservation.begintime <= '{$date} {$begintime}'
                            AND reservation.endtime >= '{$date} {$endtime}'
                            )
    ");

我做错了什么?它让我发疯,似乎无法解决这个问题。

提前致谢!

修改

开始和结束时间都是DATETIME列。

3 个答案:

答案 0 :(得分:3)

根据开始和结束时间的列类型,您的比较可能会失败,但正如评论中所示,您比较时间的逻辑是错误的。

您需要将开始时间与结束时间进行比较,反之亦然:

WHERE reservation.begintime <= '{$date} {$endtime}'
AND reservation.endtime >= '{$date} {$begintime}'

除此之外,我不知道数据的来源,但为了避免sql注入,你最好使用预备语句而不是直接在sql语句中注入php变量。

答案 1 :(得分:0)

检查双重预订的方法是:

如果现有的重新开始于B0(开始0)并结束于E0(结束0),并且您要检查的时间段是从B1到E1,那么您要检查所有现有的保留位置:

(B0 < E1) && (B1 < E0)

这些是碰撞,双重预订。

答案 2 :(得分:-1)

正如@ d&#39;警告警告上面提到的那样,你需要改变你的查询:

WHERE reservation.begintime >= '{$date} {$begintime}'
                            AND reservation.endtime <= '{$date} {$endtime}'

您希望找到一个大于开始日期且小于结束日期的预订,反之亦然。

此外,您不想使用单独的列,而是使用组合的日期时间列。