2012-08-05 39 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; 

};