2012-08-05 60 views
3

我在mysql中有一個包含開始日期和結束日期的表格。這些開始日期和結束日期適用於酒店預訂時的情況。我需要做的是顯示一個日曆,顯示預訂日期和本月可用日期。我怎樣才能找出本月的預訂日期?我可以遍歷當前每個月的每一天,但這意味着30或31個查詢,是否有更好,更優化的方法來查明本月預訂的日期,以便我可以在日曆上對代碼進行顏色編碼?獲取使用php/mysql預訂的日期

表結構是這樣的:

hotelid INT(11)

開始日期(日期)

結束日期(日期)

查詢請求:

SELECT * FROM hotel_book WHERE hotelid = 1 AND DATE_FORMAT(startdate,'%Y-%m') >= '2012-08' AND DATE_FORMAT(enddate,'%Y-%m') <= '2012-08' 

我敢肯定,我可以通過它2012-08-01和2012-08-31所以我不會處理每張支票的日期格式。但僅僅是爲了舉例。

+0

這取決於數據在數據庫中的結構。由於你沒有顯示你的桌子,所以很難說。 – hakre 2012-08-05 15:38:09

+0

@hakre我更新了我原來的帖子。 – John 2012-08-05 15:39:43

+0

酒店ID是指不同的酒店是否正確?所以大概你會讓用戶先選擇酒店,然後所有的開始和結束日期與相應的酒店ID將顯示在日曆中? – Alex 2012-08-05 15:41:43

回答

2

另一種方法是讓您的日曆接受開始和結束日期,並呈現日曆邏輯中預訂的每一天。如果日曆使用JavaScript而不是PHP或MySQL,則對服務器的影響將最小。無論哪種方式,你最終會循環,這取決於你想要發生的地方。

+0

聽起來像是一個好主意,然後您可以將日期輸出到數組中,這對於加載時間來說是微創的。他然後可以使用像http://www.ajaxavailabilitycalendar.com/ – Alex 2012-08-05 15:44:17

+0

@SXD那麼如果我通過jQuery使用日期選擇器?我可以通過jquery/ajax調用獲取所有開始和結束日期,並將其放入可能的json數組中並傳遞給datepicker?如果是的話,我該怎麼做? – John 2012-08-05 15:44:21

+0

我不確定jquery datepicker具有那種功能 – Alex 2012-08-05 15:45:20

0

所以先得到酒店ID。然後做一個查詢來獲取所有開始日期和結束日期,分別對應於該酒店ID。我建議你有第二個領域,你計算差異:

如果有人已經預訂第一到第三,那麼第二也預訂了,所以你將不得不做一個函數,計算差異,然後輸出'in之間'領域。所以它必須先獲得起始數字,然後每次增加+1天直到結束日期。因此,它最終會像陣列(1,2,3)

然後你就可以利用這個信息,並把它變成一個預訂數組一個jQuery或AJAX日曆(大量的可用在線)。據推測,一旦預訂日期,它不能再次預訂,否則你會有重複的值1,2,3 - 所以我猜酒店只有一個房間有效或什麼。

0

這裏是獲取你想要的日期的代碼。您可以在日曆上顯示關於邏輯的信息。 請注意,我使用自定義類進行數據庫選擇。

$id=$_POST['id']; 
$days=$db->select("reservations","room_id=".$id); 
$listofdays=array(); 
foreach ($days $day) { 
$start=$day['start']; 
$end=$day['end']; 
$liste=array(); //This array will be filled with dates between start and end 
$liste=date_range($start, $end, $step = '+1 day', $output_format = 'm-d-Y' ); 
foreach ($liste as $key => $list) { 
$listofdays[] = $list; 

} 
} 

// DATE_RANGE以下功能:

function date_range($first, $last, $step = '+1 day', $output_format = 'm/d/Y') { 

$dates = array(); 
$current = strtotime($first); 
$last = strtotime($last); 

while($current <= $last) { 

    $dates[] = date($output_format, $current); 
    $current = strtotime($step, $current); 
} 

return $dates; 

};