我正在使用 PHP 5.1 开发一个 session 室预订系统,我需要强制执行一种机制,即任何两个用户都不能在同一天的同一时间预订房间。系统将 time_in、time_out、from_date、to_date 存储在数据库中。我应该使用什么算法来防止冲突?
我最初想保留 time_in 和 time_out 字段 UNIQUE
在数据库中,但在用户 A 预订 9 to 5 on 12-05-2014
的情况下即
**User A**
time_in => 09:00
time_out => 05:00
reservation_date => 12/05/2014
用户 B 在同一天来预订 12 到 3 人,即
**User B**
time_in => 12:00
time_out => 03:00
reservation_date => 12/05/2014
time_in time_out 不同,系统会接受预订。所以这个算法会失败。
此外,人们还可以选择预订几天,例如我想预订 1 号房间 10 天,每天从 9 点到 5 点。那么有人可以帮我解决这里的算法问题吗?
最佳答案
根据您的描述,我假设预订如下
房间:1
time_in: 9:00
, time_out: 13:00
,
from_date:11/01/2014
,to_date:11/03/2014
表示在 11 月 1 日、2 日和 3 日这三天,房间预订时间为每天上午 9 点至下午 1 点。也就是说,这并不意味着预订从 11 月 1 日上午 9 点开始,一直持续到 11 月 3 日下午 1 点。
根据这些假设,需要解决的根本问题是确定两个保留是否会重叠。为了简洁起见,我将在此处将保留表示为元组:
[房间,time_in,time_out,from_date,to_date]
如果房间相同且时间范围和日期范围重叠,则两次预订重叠。也就是说,给定保留 [r,a,b,c,d]
和 [R,A,B,C,D]
,如果 r = R
,a..b
与 A..B
重叠,c..d
与 C.. D
。当且仅当
r = R and b >= A and a <= B and c >= D and d <= C
使用上面的表达式,您可以编写一个查询来计算数据库中所有现有的元组,这些元组将与建议的新保留冲突,如果计数为零,则插入建议的保留。 (小写字母将是代表建议保留的查询参数,大写字母将是数据库中的列名称。我将留给您找出执行计数和条件插入的 SQL。)
请注意,重叠比较是否正确可能不会立即显而易见。通过查看两个时间(或日期)范围可能发生的所有方式,您可以说服自己它们是。下面显示的是时间范围的可能关系。括号和尖括号旨在帮助可视化每个范围的两个端点。
(a b) <A B> condition b >= A fails, no overlap
(a <A b) B> both conditions met, overlap
(a <A B> b) both conditions met, overlap
<A (a b) B> both conditions met, overlap
<A (a D> b) both conditions met, overlap
<A B> (a b) condition a <= B fails, no overlap
关于php - 防止两个保留之间发生冲突的代码逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196411/