Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查MySQL预订数据库中的可用性块?_Php_Mysql_Arrays_Search_Multidimensional Array - Fatal编程技术网

Php 如何检查MySQL预订数据库中的可用性块?

Php 如何检查MySQL预订数据库中的可用性块?,php,mysql,arrays,search,multidimensional-array,Php,Mysql,Arrays,Search,Multidimensional Array,我有一个住宿预订引擎,它遵循以下规则: 用户可以在任何日期预订多达7间客房 用户只能预订2天、4天和6天的区块 用户无法预订周四(因清洁而关闭) 有时,由于公司团体预订,整个星期都不可用 以下是一些例子: 两天的街区可能是周五和周六、周日和周一或周二和周三 一个为期4天的街区可能是周五到周一或周日到周三 一个为期6天的街区可能是从周五到周三 该系统在数据库中有一个简单的表,它是包含7个房间的每个日期的列表。每个房间的字段可以为0表示不可用,也可以为1表示可用 该表称为vg\u预订\u可用

我有一个住宿预订引擎,它遵循以下规则:

  • 用户可以在任何日期预订多达7间客房
  • 用户只能预订2天、4天和6天的区块
  • 用户无法预订周四(因清洁而关闭)
  • 有时,由于公司团体预订,整个星期都不可用
以下是一些例子:

  • 两天的街区可能是周五和周六、周日和周一或周二和周三
  • 一个为期4天的街区可能是周五到周一或周日到周三
  • 一个为期6天的街区可能是从周五到周三
该系统在数据库中有一个简单的表,它是包含7个房间的每个日期的列表。每个房间的字段可以为0表示不可用,也可以为1表示可用

该表称为
vg\u预订\u可用性
。这是一张快照

我需要一种根据用户搜索选择搜索表的方法

搜索可能是2天、4天或1到7个房间的任意组合


我不确定解决方案是否是对所有日期和所有房间进行数据库查找,然后创建多维数组并与用户的搜索进行交叉检查是前进的方向。如果我是这样做的呢?

这里有一种在SQL中实现的方法,对于两天的预订,对于
room_1

SELECT
    avail1.date start_date,
    "room_1" room_name
FROM vg_booking_availability avail1
/* This row is the next day to the first one */
INNER JOIN vg_booking_availability avail2 ON (avail1.date + 1 = avail2.date)
WHERE
    avail1.room_1 = 0
    AND avail2.room_1 = 0
    /* Add in a clause to check future dates only here */
;
您可以将此文件中的所有文件室添加为括号内的
语句,但我倾向于将其作为单独的查询运行(否则您必须在PHP中重新搜索结果,以确定返回的可用文件室)

我们在这里遇到了一点麻烦,因为所有的房间都是非规范化的——它们最好放在另一张桌子上,在那里它们可以得到更一般的处理

可以通过分别为4天和7天搜索添加更多别名行来扩展此示例。星期四房间不可用(或任何其他规则)与问题没有直接关系,因为您只需创建未来的可用行(基于未来人员预订的距离),然后根据这些规则使房间不可用。这是一个单独的(且微不足道的)问题

我也倾向于改变这一点,因此您可以使用
NULL
作为可用项,使用customer表的外键作为不可用项。这将为您提供有关房间不可用原因的有用信息,并允许您在特定客户取消预订时轻松地再次提供房间


最后,此解决方案具有大量联接的能力,因此针对数据集进行测试是非常必要的。如果要在10K行的表上运行此操作,则可以,但如果有1M行,则可能不行(当然,这取决于硬件和负载)。因此,一旦你能做到这一点,我建议你创建一个数据生成器(PHP非常适合),并确保你能获得所需的性能。

你只根据给定用户的输入进行搜索,还是不想显示空闲时间列表?嗨,哈弗,我已经在一个非常聪明的日历上显示了空闲时间列表。需要添加功能,因此如果用户还需要一定数量的天数和一定数量的房间,我们可以显示有哪些选项。确实@halfer非常感谢