我有预订系统。
在MySQL数据库中,我有一个预订表,其中包含hh:mm:ss
形式的任何给定预订的开始时间和结束时间字段。秒数始终为00.
在我的预订系统中,我会在新的预订时发送时间,也可以以hh:mm:ss的形式开始时间和结束时间。
我需要检查我要做的新预订是否与之前已经在数据库中的预订重叠。
首先,我将有2个变量,其中包含通过POST发送的开始和结束时间。
$startNewBooking
和$endNewBooking
所以我的SQL可能会像这样开始
SELECT * FROM bookings WHERE starttime>=$startNewBooking AND .........
如果找到重叠时间,则回显错误... i.o.w如果是row count > 0
。
请帮我解决一些语法或逻辑。
谢谢
答案 0 :(得分:2)
这是我的查询,只需根据需要编辑值
$sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
WHERE
(
(startdate < start_at AND startdate > start_at)
OR
(startdate > start_at AND enddate < end_at)
)
AND
meeting_room_id = whatever_id i was on about at the time :P";
如果要对数据进行清理,则需要将“startdate”和“enddate”值替换为“?”并做这样的事情 - &gt;
$sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
WHERE
(
(? < start_at AND ? > start_at)
OR
(? > start_at AND ? < end_at)
)
AND
meeting_room_id = ?";
$result = p4a_db::singleton()->fetchRow($sql, array($date, $date, $date, $dateend, $merono));
进一步:
$sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
WHERE
(
( start_at >= ? AND start_at <= ? )
OR
( start_at <= ? AND end_at >= ? )
OR
( end_at >= ? AND end_at <= ? )
OR
( ? >= ? )
)
AND
meeting_room_id = ?";
$result = p4a_db::singleton()->fetchRow( $sql, array( $date, $dateend, $date, $dateend, $date, $dateend, $date, $dateend, $merono ) );
此方法不允许任何日期进入字段周围字段外的字段或该区域的任何其他可能性(参见图表):
|| |-----------| || first booking
|-----| ok
|---| fails
|----| fails
|----| fails
如果您需要完整说明,请转到This Topic
当您执行错误消息时,您还需要执行其他操作,因此此语法应该完成此任务:
if ( 0 == $result["num"] )
{
p4a_db::singleton()->query( "INSERT INTO meeting_room_bookings ( start_at, end_at, meeting_room_id, tennant_id, centre_id )
VALUES
( ?, ?, ?, ?, ? )", array( $date, $dateend, $merono, $row['tennant_id'], $centreRow['id'] ) );
return true;
}
else
{
P4A::singleton()->messageError("The selected times conflict with another booking. Please select another time or meeting room!");
}
请忽略具有中心ID和tennant id的字段(除非您使用这些字段),他们在那里确保将预订设置为正确的租户和正确的会议室。根据需要使用它并替换你需要的东西。
顺便说一句,我正在使用p4a应用程序框架,因此您需要将P4A::singleton()->messageError
替换为php错误消息mobober