我制作了这张表,所有日期都在 2063 年之前,为了简单起见,它包含 3 列已预先填充的列,示例如下...
AutoInc | date | status
1 | 2013-05-05 | available
2 | 2013-05-06 | available
3 | 2013-05-07 | booked
4 | 2013-05-08 | booked
5 | 2013-05-09 | booked
6 | 2013-05-10 | available
7 | 2013-05-11 | booked
8 | 2013-05-12 | available
现在,检查日期是否可用对我来说很容易,但不同的是这个日历将检查他们需要的块中是否有可用的日期(例如连续 4 天)他们最初输入的日期的任一侧.
切入正题,我已经确定了任何一个方向的下一个可用日期,但我需要的是它检查块,即连续接下来的 4 天在桌子上的任一方向可用。可以对此代码进行一些更改吗?
$previousDate = mysql_query("SELECT * FROM calendar WHERE autoInc < $requestedDate AND status='available' ORDER BY autoInc DESC");
如果您需要更多,请告诉我,
好的,到目前为止的实际故事......
实际表
AutoIncNo | BookingDate | Status
日历分为两部分。
日历选择日期
一个列表菜单,用于选择他们希望入住的晚数。
所以我采用原始日期(他们选择的日期)并重新排列格式以适合表格......
$CalendarDate = str_replace("/", "-", "$CalendarDate");
$QueryDate = date("Y-m-d", strtotime($CalendarDate));
连接数据库...
include_once('../connect/connectdatabase.php');
运行第一个查询以检查他们需要的日期是否可用。
$QueryDate 是他们选择的日期
$NightsForQuery 是他们想要入住的晚数
$CalendarQuery = mysql_query("SELECT * FROM BookingsCalendar WHERE BookingDate='$QueryDate' LIMIT 1");
while($row = mysql_fetch_array($CalendarQuery)) {$AutoInc = $row["AutoIncNo"];}
$AutoInc2 = $AutoInc + $NightsForQuery - 2;
$SelectDates = mysql_query("SELECT * FROM BookingsCalendar WHERE AutoIncNo BETWEEN $AutoInc AND $AutoInc2");
while($row = mysql_fetch_array($SelectDates)) {
$AutoIncNo = $row["AutoIncNo"];
$BookingDate = $row["BookingDate"];
$Status = $row["Status"];
if ($Status == 'booked') {
$LastBookedDate = $BookingDate;
$LastAutoIncNo = $AutoIncNo;
$Handle = 1;
}
} // End - while($row = mysql_fetch_array($SelectDates)) {
if ($Handle !== 1) {echo 'DATES AVAILABLE >> WRITE BOOKING CODE';}
因此,如果句柄不等于 1,则可以预订,但是,如果日期不可用(即 $Handle == 1),我需要检查两边(之前和之后)最接近的可用日期他们想要的日期,在他们希望停留的夜数中,状态是“可用”的......
因此,我着手确定任一方向的第一个可用日期,以及我遇到困难的地方。看着它,我相信你可以运行一个 while 循环来找到上面代码中的下一个可用块,但不确定如何。
if ($Handle == 1) {
$FirstDateQuery = mysql_query("SELECT * FROM BookingsCalendar WHERE AutoIncNo < $LastAutoIncNo AND Status='available' ORDER BY AutoIncNo DESC LIMIT 1");
while($row = mysql_fetch_array($FirstDateQuery)) {
$AutoIncNo = $row["AutoIncNo"];
$BookingDate = $row["BookingDate"];
$Status = $row["Status"];
} // End - while($row = mysql_fetch_array($SelectDates)) {
$FirstBookedDate = $BookingDate;
echo $FirstBookedDate . ' - ' . $LastBookedDate;
} // End - if ($Handle == 1) {
如果你有更好更有效的方法或者可以适应已经存在的东西,那就太好了......我的大脑很痛哈哈。
继续...
我把它分解成这个...
SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo < $LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4
它可以正常工作,但是,它会单独选择前 4 行。
因此,例如,如果有人尝试从 2013.06.01 开始预订,但由于在接下来的 4 天内“预订”而无法预订,则上述脚本运行并显示 2013.05.31 - 2013.05.30 - 2013.05.29 - 2013.05.28 作为结果。
但是,如果其中一个日期被预订,它将跳过它并给我下一个(选择因为它是满足条件“可用”的下一个 4 个)
因此,如果说 2013.05.29 被预订,它将显示 2013.05.31 - 2013.05.30 - 2013.05.28 - 2013.05.27 错过了预订的那一天。
现在的问题是我们需要接下来的 4 行一起(不分割/连续/不中断日期),它们是“可用的”。
有任何想法吗?
更新:
问题是它仍然会选择接下来的 4 行,但不会一起选择,因为它们按日期显示。因此,如果有人在日期之前或之后搜索 4 天,他们将获得结果,但他们将分散在预订的日期之间。当他们预订时,它将需要 1 整个期间,明白我的意思吗?
也许我没有很好地解释它,对此感到抱歉,但结果必须是一个块/一起,没有任何“中间的预订日期”。
整个查询:
$FirstDateQuery = mysql_query("SELECT * FROM ((SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo < $LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4)UNION (SELECT * FROM BookingsCalendar WHERE Status='available' AND AutoIncNo > $LastAutoIncNo ORDER BY AutoIncNo ASC LIMIT 4)) as avail_4 ORDER BY avail_4.AutoIncNo DESC")or die(mysql_error());
while($row = mysql_fetch_array($FirstDateQuery)) {
$AutoIncNo = $row["AutoIncNo"];
$BookingDate = $row["BookingDate"];
$Status = $row["Status"];
$avail_4 = $row["avail_4"];
echo $BookingDate . ' ' . $avail_4 . ' ' . ' ';
} // End - while($row = mysql_fetch_array($FirstDateQuery)) {
这行得通,但并没有完全达到目标。
可玩的数据:
这些脚本将按照我的方式设置表格......
CREATE TABLE `table_setup` (
`number` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`number`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
INSERT INTO table_setup VALUES(NULL);
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
INSERT INTO table_setup SELECT NULL FROM table_setup;
DELETE FROM table_setup WHERE NUMBER > 18264;
CREATE TABLE `BookingsCalendar` (
`AutoIncNo` SMALLINT(2) NOT NULL AUTO_INCREMENT,
`BookingDate` DATE NOT NULL,
`Status` VARCHAR(10) NOT NULL DEFAULT 'available'
`InvoiceRefference` varchar(40) NOT NULL,
`CustomerName` varchar(40) NOT NULL,
`CustomerEmail` varchar(40) NOT NULL,
`CustomerPhone` varchar(30) NOT NULL,
`Address1` varchar(100) NOT NULL,
`County` varchar(40) NOT NULL,
`Country` varchar(30) NOT NULL,
`PostCode` varchar(10) NOT NULL,
PRIMARY KEY (`AutoIncNo`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;
INSERT INTO BookingsCalendar (BookingDate)
SELECT DATE_ADD('2013-05-05', INTERVAL number-1 DAY)
FROM table_setup
WHERE NUMBER < 18264;
DROP TABLE `table_setup`