-1

我有一个预订系统。

在 MySQL 数据库中,我有一个 bookings 表,其中包含任何给定预订的开始时间和结束时间字段,格式为hh:mm:ss. 秒数始终为 00。

从我的预订系统中,我发送新预订的时间,也以 hh:mm:ss 形式的开始时间和结束时间的形式发送。

我需要检查我尝试进行的新预订是否与数据库中已有的先前预订重叠。

因此,首先,我将有 2 个变量,其中包含通过 POST 发送的开始时间和结束时间。

$startNewBooking$endNewBooking

所以我的 SQL 可能会像这样开始

SELECT * FROM bookings WHERE starttime>=$startNewBooking AND .........

如果发现重叠时间,则回显错误... iow 如果row count > 0.

请为此提供一些语法或逻辑。

谢谢你

4

1 回答 1

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 值替换为“?” 并做这样的事情->

 $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

如果您需要完整的解释,请转到此主题

当您执行错误消息时,您还需要执行 if else 所以这个语法应该可以完成这项工作:

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!");
        }

请忽略带有 center id 和tennant id 的字段(除非您使用这些),它们在那里确保预订设置到正确的租户和正确的会议室。根据需要使用它并替换你需要的东西。


顺便说一句,我正在使用 p4a 应用程序框架,因此您需要替换P4A::singleton()->messageError为 php 错误消息 mobober

于 2013-01-24T14:32:51.423 回答