我有一个日历,我可以选择日期,然后会出现一个时间表。在表格中,我可以看到有关已预订时间段的用户的信息,或者单击保留链接。
要显示信息,我选中我的预订表中所有记录,其中房间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();
}
我发现了错误!
每次我删除上次预订时,都不会再次预订该时段。
答案 0 :(得分:1)
在预订脚本中,您必须再次检查插槽是否空闲,然后再尝试预订。
甚至可能有两个人试图同时预订同一个插槽。只有其中一个人应该获得这个位置。
此外,为了确保您永远不会被双重预订,您可以在MySQL数据库中添加CONSTRAINT
。
CREATE UNIQUE INDEX `idx_booking` ON `bookings` (room_id, eventDate)
如果您尝试在同一天预订两次房间,则INSERT
查询将失败。这可能是也可能不是所希望的。有时人们只会待很短的时间,所以也许你想要允许双重预订。
答案 1 :(得分:0)
在您的查询中放置一些条件逻辑,引用预订或保留状态,具体取决于此答案继续您的逻辑