防止时间段被双重预订

时间:2014-04-23 11:23:36

标签: php mysql sql unique

我有一个日历,我可以选择日期,然后会出现一个时间表。在表格中,我可以看到有关已预订时间段的用户的信息,或者单击保留链接。

要显示信息,我选中我的预订表中所有记录,其中房间ID等于我预订的当前房间,eventdate,等于我在日历中点击的日期和时间段,它等于我点击的时间段:

$sql = "SELECT * FROM bookings WHERE room_id= '" . $room_id . "' AND eventDate='" . $dateToCompare . "'AND timeslot = $time;";
$result = $db->mysqli->query ( $sql );

    if (mysqli_num_rows ( $result ) == 0) {
        echo "<a href='" . $_SERVER ['PHP_SELF'] . "?id=" . $room_id . "&month=" . $month . "&day=" . $day . "&year=" . $year . "&t={$time}&v=true&f=true&reserved=true'><h3 style='color: rgb(255,0,0);'>Reserve</h3></a>";
    } 

    else {  .... }

如您所见,我在保留链接中设置了put reserved = true,并通过调用我插入到我的数据库中。

if (isset ( $_GET ['reserved'] )) {
    $sqlreserve = "INSERT INTO bookings (user_id, room_id, eventDate, timeslot) VALUES ('" . $user_id . "','" . $room_id . "','" . $dateToCompare . "','" . intval ( $_GET ['t'] ) . "');";
    $resultreserve = $db->mysqli->query ( $sqlreserve );
    echo $resultreserve;
}

我最终会看到类似这样的链接:

mysite.php/id=2&month=04&day=23&year=2014&t=12&v=true&f=true&reserved=true

然而,这是我遇到问题的地方。如果我刷新页面,将再次进行预订。我对解决方案有点失落,这就是我问你们的原因。

如何在某一特定日期重新安排特定时间段,只能预订一次?

我的数据库中的预订将如下所示:

user_id - room_id - eventDate - timeslot
28        3         04/18/2014  8

eventdate和时间段不应单独使用。时隙的值可以是fx的10,200倍。但是eventdate和时间段应该是UNIQUE togeather。

这可能吗?

修改

我试着添加这个:

ALTER TABLE `exam`.`bookings` ADD UNIQUE `idx_booking` (`eventDate`, `timeslot`);

它几乎可以工作。但是,我无法删除我最后保留的时间段。我可以删除所有其他人。

我的删除内容如下:

if ($booking->deleteBooking($_GET['id']))
{
    header('Location: ' . $_SERVER['HTTP_REFERER']);
}
else
{
    echo "Could not delete the booking!";
}



public function deleteBooking($id)
    {
        $sql = "DELETE FROM bookings WHERE id = ?";
        if (!$result = $this->db->mysqli->prepare($sql))
        {
            return false;
        }

        if (!$result->bind_param('i', $id))
        {
            return false;
        }

        return $result->execute();
    }

我发现了错误!

每次我删除上次预订时,都不会再次预订该时段。

2 个答案:

答案 0 :(得分:1)

在预订脚本中,您必须再次检查插槽是否空闲,然后再尝试预订。

甚至可能有两个人试图同时预订同一个插槽。只有其中一个人应该获得这个位置。


此外,为了确保您永远不会被双重预订,您可以在MySQL数据库中添加CONSTRAINT

CREATE UNIQUE INDEX `idx_booking` ON `bookings` (room_id, eventDate)

如果您尝试在同一天预订两次房间,则INSERT查询将失败。这可能是也可能不是所希望的。有时人们只会待很短的时间,所以也许你想要允许双重预订。

答案 1 :(得分:0)

在您的查询中放置一些条件逻辑,引用预订或保留状态,具体取决于此答案继续您的逻辑