使用php/mysql获取已预订的日期

3
我在mysql中有一个表格,它记录了酒店预订的开始和结束日期。我需要展示一个日历,展示当前月份内已预订的日期和可用日期。那么如何找出当前月份内预订的日期呢?我可以循环遍历当前月份的每一天,但这意味着30或31个查询,有没有更好、更优化的方法来查找本月预订的日期,以便在日历上标记颜色? 表结构如下: hotelid int(11) startdate (date) enddate (date) 请求查询:
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,这样就不必在每个检查时处理日期格式了。但只是举个例子。


这取决于您的数据库中数据的结构。由于您没有展示您的表格,因此很难说。 - hakre
酒店ID指的是不同的酒店,对吗?因此,您可能需要让用户首先选择酒店,然后在日历中显示该酒店ID下的所有开始和结束日期。 - Alex
@Alex 是的,当查询本月表格时,我将拥有酒店ID。 - John
首先,您能否在获取2012年8月酒店ID为1的所有日期的问题中添加一个查询? - hakre
@hakre 或许我误解了你的问题,我以为你只是要一个简单的查询来获取当前月份酒店的所有记录。最初我会使用date('t')获取当月的天数,然后循环遍历每个日期,并使用一个between查询来查询我在date('t')中拥有的每个日期。所以如果这个月有31天,我会先查询2012-01-08,然后查询数据库,接着查询下一天的2012-02-08,直到我查询完31天。 - John
显示剩余3条评论
3个回答

2

另一种方法是允许您的日历接受开始和结束日期,并在日历逻辑内呈现每个已预订的日期。如果日历使用的是JavaScript而不是PHP或MySQL,对服务器的影响将最小化。无论哪种方式,您最终都需要循环,只是取决于您想要发生这种情况的位置。


听起来是个好主意,然后你可以将日期输出到一个数组中,这对加载时间的影响最小。他随后可以使用类似 http://www.ajaxavailabilitycalendar.com/ 的东西。 - Alex
@SXD 如果我通过jquery使用日期选择器,我能否通过jquery/ajax调用获取所有的起始和结束日期,并将其放入json数组中传递给日期选择器?如果可以,具体该如何实现? - John
我不确定 jQuery 日期选择器是否具有那种功能。 - Alex
@SXD 问题是我只有日期范围,所以为了做到这一点,我必须处理日期范围之间的所有单个日期。除非有一种简单的方法可以通过代码来解决这个问题? - John
是的,看这个例子,你需要一些逻辑来根据开始和结束日期填充你的日期数组,类似于这样:https://dev59.com/bG855IYBdhLWcg3wUSgW - jimhartford
显示剩余2条评论

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;

};


0
首先获取酒店ID。然后查询与该酒店ID相关的所有开始和结束日期。我建议您有第二个字段,用于计算差异:
如果有人预订了1日至3日,则第2日也已被预订,因此您需要编写一个计算差异然后输出“中间”字段的函数。因此,它必须首先获取起始编号,然后每次添加+1天,直到结束日期。因此,它最终会变成array(1,2,3)。
然后,您可以将此信息放入jquery或ajax日历的已预订数组中(在线提供了很多)。假设一旦预订了日期,就不能再次预订,否则您将具有重复值1,2,3-因此我猜测酒店只有一个可用房间或类似的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接