【问题标题】:Get dates that are booked using php/mysql获取使用 php/mysql 预订的日期
【发布时间】:2012-08-02 19:11:18
【问题描述】:

我在 mysql 中有一个包含开始和结束日期的表。这些开始和结束日期适用于预订酒店的时间。我需要做的是显示一个日历,显示已预订的日期和当月可用的日期。我如何知道当月的预订日期?我可以循环浏览当月的每一天,但这意味着 30 或 31 个查询,是否有更好、更优化的方法来找出当月预订的日期,以便我可以在日历上对日期进行颜色编码?

表结构是这样的:

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 通过,所以我不会在每张支票上处理日期格式。但仅用于示例目的。

【问题讨论】:

  • 这在一定程度上取决于数据库中数据的结构。由于您没有展示您的桌子,所以很难说。
  • @hakre 我更新了我原来的帖子。
  • 酒店ID指的是不同的酒店对吗?所以大概你会让用户首先选择酒店,然后所有具有相应酒店 ID 的开始和结束日期都会显示在日历中?
  • @Alex 是的,当查询当前月份的表时,我会得到 hotelid。
  • 所以第一件事。您能否在问题中添加一个查询,以获取酒店 ID 1 的 2012 年 8 月的所有日期?

标签: php mysql date


【解决方案1】:

另一种方法是让您的日历接受开始和结束日期,并呈现在日历逻辑中预订的每一天。如果日历使用 javascript 而不是 PHP 或 MySQL,对您的服务器的影响将是最小的。无论哪种方式,您最终都会循环,这取决于您希望在哪里发生。

【讨论】:

  • 听起来是个好主意,然后您可以将日期输出到数组中,这将对加载时间的影响最小。然后他可以使用类似ajaxavailabilitycalendar.com
  • @SXD 那么如果我通过 jquery 使用日期选择器呢?我可以通过 jquery/ajax 调用获取所有开始和结束日期并放入一个 json 数组并传递给日期选择器吗?如果是这样,我该怎么做?
  • 我不确定 jquery datepicker 有那种功能
  • 如果您只是想阻止已经预订的日期,您可以使用 beforeShowDay 事件...tokenposts.blogspot.com/2011/05/…
  • @SXD 问题是我只有日期范围,所以为了做到这一点,我必须处理日期范围之间的所有单独日期。除非有一种简单的方法可以明智地解决代码?
【解决方案2】:

所以首先获取酒店 ID。然后进行查询以获取与该酒店 ID 相关的所有开始和结束日期。我建议你有第二个字段来计算差异:

如果有人预订了第 1 到第 3,那么也预订了第 2,因此您必须创建一个函数来计算差异,然后输出“中间”字段。因此,它必须首先获取开始编号,然后每次添加 +1 天,直到结束日期。所以它最终会像 array(1,2,3)

然后您可以获取此信息并将其放入 jquery 或 ajax 日历的预订数组中(网上有很多可用的)。据推测,一旦预订了日期,就不能再次预订,否则您将有重复的值 1,2,3 - 所以我猜酒店只有一个房间可用或其他什么。

【讨论】:

    【解决方案3】:

    这是获取所需日期的代码。您将能够在日历上显示它们的逻辑。 请注意,我使用自定义类进行数据库选择。

    $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;
    

    };

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多