2013-05-29 53 views
0

我正在製作一個客房預訂系統,用戶輸入預訂時間。輸入全部通過點擊框完成,這部分只是一個檢查,以確保人們不會篡改GET值來覆蓋事物。這是我到目前爲止有:根據數據庫中的值檢查重疊時間

$Username = mysql_real_escape_string(($_POST['Username'])); 
$DateBooked = mysql_real_escape_string(($_POST['DateBooked'])); 
$Room = mysql_real_escape_string(($_POST['Room'])); 
$StartTime = mysql_real_escape_string(($_POST['StartTime'])); 
$EndTime = mysql_real_escape_string(($_POST['EndTime'])); 

$query="SELECT bookingid,StartTime,EndTime 
     FROM bookings 
     WHERE DateBooked = '$DateBooked' AND Room='$Room' AND Approved = 1"; 
$result=mysql_query($query); 
$num=mysql_num_rows($result); 

$i=1; 
while ($i <= $num) 
{ 
    $MinValue=mysql_result($result,$i,"StartTime"); 
    $MaxValue=mysql_result($result,$i,"EndTime"); 
    if ((($StartTime >= $MinValue) && ($StartTime <= $maxValue)) || 
      (($EndTime >= $MinValue) && ($EndTime <= $maxValue))) { 
     $overflowed=true; 
    } 
    $i++; 
} 

if ($overflowed) 
{ 
//Error message 
} 
else 
{ 
//Save to database 
} 

我的問題是這樣的:

  • 14:00-16:00保存在數據庫
  • 嘗試預訂13:00-15:00:錯誤給出正確。
  • 嘗試預訂15:00-17:00:沒有錯誤給出。

我在做什麼錯?

謝謝!

+0

你如何在數據庫中存儲時間? –

+1

它可能是代碼中的'$ MaxValue'和'$ maxValue'不一致嗎? – rtcherry

+2

如果日期/時間存儲爲實際日期時間或時間戳,則可以輕鬆查詢單個查詢中重疊條目的計數。通過兩個事件A和B,可以發現只有'startA <= endB AND startB <= endA'的重疊。這將檢查全部5個重疊條件。 –

回答

0

你有幾個問題:

首先:你有不一致的變量$MaxValue$maxValue

第二個mysql_result的行號開始於0

第三:您的比較不正確。

您應該將循環改成這樣:

$i=0; 
while ($i < $num) 
{ 
    $MinValue=mysql_result($result,$i,"StartTime"); 
    $MaxValue=mysql_result($result,$i,"EndTime"); 
    if (($StartTime < $MaxValue) && ($MinValue < $EndTime)) { 
     $overflowed=true; 
    } 
    $i++; 
} 

編輯:你可以以其它方式改進的代碼也是如此,例如,一旦你已經確定存在重疊,你可以停止while環。此外,您可能不希望在當天循環處理給定房間的每個請求。您可以讓SQL查詢返回已批准的請求,這些請求的時間與新請求位於同一窗口中(允許您放棄while循環)。

編輯2Here是關於重疊日期的更多信息。

+0

1)Woops,忘了帽子!感謝那一個,應該已經注意到了。 2)再次感謝提示。 3)這不僅僅是檢查整個時間是否在現有時間內?因此,如果存儲的時間是10:00-16:00,並且我試圖預訂13:00-15:00,那麼不會觸發錯誤,因爲$ MinValue不是<$ EndTime?除非我誤解。 –

+0

我應該解釋一下,我試圖弄清楚,如果$ StartTime或$ EndTime介於$ MaxValue或$ MinValue之間,就會觸發一個錯誤。 –

+0

應該可能標記你! :-P @rtcherry –