Я сделал эту таблицу со всеми датами лет, идущими до 2063 года, чтобы сохранить ее просто, она содержит 3 столбца, popluated, например, следующим образом ...Справка MYSQL/PHP - выбор следующих доступных дат из таблицы с каждой стороны от первоначального бронирования
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");
Если вам нужно больше, пожалуйста, дайте мне знать,
OK, фактическая история до сих пор ...
Фактический стол
AutoIncNo | BookingDate | Status
календарь в 2 части.
Календарь для выбора даты
в списке меню, чтобы выбрать количество ночей они хотят остаться.
Итак, я беру оригинальную дату (один они выбирают) и изменить формат, чтобы соответствовать таблице ...
$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 строки вместе (неразделенные/непрерывные/без перерывов в датах), которые являются «доступными».
Любые идеи?
UPDATE:
Дело в том, что он все равно будет выбрать следующие 4 строки, но не вместе, как они появляются по дате. Итак, если кто-то ищет за 4 дня до или после даты, они получат результат, но они будут распределены между датами, которые забронированы. Когда они забронируют, ему понадобится 1 полный период, посмотрите, что я имею в виду?
Возможно, я не очень хорошо объясняю это, поэтому сожалею об этом, но результат должен быть в блоке/вместе без каких-либо «забронированных дат между ними».
ВЕСЬ QUERY:
$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)) {
Это работает, но не совсем достичь цели.
DATA играть с:
эти сценарии настройки таблицы так, как я его ...
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`
Спасибо за ваш ответ, я отредактировал это сообщение, чтобы больше информации было –
Итак, я понимаю, что вы ищете предыдущие 4 доступные и следующие 4 доступные детали бронирования, а не только предыдущие 4 и следующие 4. –
'SELECT * FROM (SELECT * FROM BookingsCalendar WHERE Status = 'доступен' и AutoIncNo <$ LastAutoIncNo ORDER BY AutoIncNo DESC LIMIT 4 UNION SELECT * FROM BookingsCalendar WHERE Status = 'доступен' и AutoIncNo> $ LastAutoIncNo ORDER BY AutoIncNo ASC LIMIT 4) as avail_4 ORDER BY avail_4.AutoIncNo DESC' –