2013-04-04 20 views
1

我有一個數據庫,人們可以在兩個特定時間內預訂房間,但可能有其他人在同一時間內搜索可用房間 - 或部分在同一時間。MySQL/PHP:捕獲2次之間的所有條目並檢查其他時間

數據庫看起來是這樣的:

order | room | user | date (date-format) | from (time) | to (time) 
1  123 foo 2013-04-04   12:00:00  17:00:00 

問題是當其他用戶搜索如果房間可從f.ex 13:00至18:00,因爲我只是設法搜索如果房間可以在同一時間獲得。

查詢必須在特定日期和時間的特定房間上進行搜索。如果房間內全部或部分時間都很忙,我想趕快告訴用戶房間很忙。

任何提示?如果它更容易通過PHP來管理我會很高興太:-)

+0

人們如何搜索房間?是否有另一張桌子包含有關房間的信息?你提交的表格中是否會有一排?或者只是列用戶,日期,從和被設置爲NULL? – fancyPants 2013-04-04 10:08:25

+0

我有一個包含房間(房間名稱和房型)的表格。 「房間」表中的房間名與「預訂」中的房間名相同(如示例所示)。人們首先選擇一個房間,然後在一定時間內檢查「預訂」表格的可用性。 「預訂」數據庫中的所有條目都會有數據(如示例所示)。 – dbso 2013-04-04 10:11:58

回答

2

爲什麼使用這樣的SQL(未經測試)沒有解決它:

SELECT * 
FROM booked 
WHERE 
    room=$room AND 
    date=$date AND 
    (
     (
      /* 
      The reservation starts in the requested period 
      */  
      from <= $start_time AND 
      to > $start_time 
     ) OR (
      /* 
      The reservation ends in the requested period 
      */ 
      from < $end_time AND 
      to >= $end_time 
     ) 
    );  

這個查詢將返回$start_time$end_time之間的所有預訂和允許保留背靠背。如果您不想允許背靠背預訂,請將<>更改爲<==>

重要:確保不要僅使用字符串插值並插入用戶提供的輸入,因爲這會使您的應用程序容易受到SQL注入攻擊。

+0

這似乎是訣竅。先生非常感謝您 :) – dbso 2013-04-04 10:27:57

0

對答案的改進由@Delphinator

SELECT * 
FROM booked 
WHERE 
    room=$room AND 
    date=$date AND 
    (
     TIME("$start_time") BETWEEN from and to 
     OR 
     TIME("$end_time") BETWEEN from and to 
    ); 

BETWEEN不正是你會怎麼想。

相關問題