Проверка занятых номеров в гостинице

Статус
В этой теме нельзя размещать новые ответы.

drkrol

Постоялец
Регистрация
6 Мар 2016
Сообщения
112
Реакции
11
Здравствуйте. Пишу скрипт для бронирования номеров в гостинице.
Есть две вот такие таблицы:
allnomer, где указаны все номера. В гостинице есть 3 номера lux: 301, 302 и 303
e88df094d6f84cf49d0e18ebe6724f91.PNG

и main, где указаны все брони
88925ff8f48449f6a5cffe4c8a09ba57.PNG

Я пытаюсь сделать скрипт, который будет проверять номера на занятость, и в случае нахождения свободного номера, выдаёт брони этот номер.
Чуть подробнее. У меня есть дата заезда и дата выезда новой брони: 2016-11-28 и 2016-11-30. Это диапазон дат. То есть 28, 29 и 30 числа в гостинице собираются жить люди. В гостинице уже забронированы два номера. Первый (301) на даты с 2016-11-29 по 2016-12-01, второй (302) на даты с 2016-12-01 по 2016-12-02. Человек не может заехать в 301 номер, так как 29 и 30 числа этот номер будет занят. У нас остаётся два номера: 302 и 303. 302 номер занят только 01 и 02. Ни одна дата не пересекается и поэтому нам 302 номер подходит. Переменная $namenomer принимает значение 302 и подставляется в скрипт.
Вот такой у меня сейчас скрипт:
PHP:
<?php
$nnomer = "lux"; // тип номера
$newdatestart = "2016-11-28"; // дата заезда
$newdateend = "2016-11-30"; // дата выезда
// Константа. Запрос в таблицу allnomer
const SQL_GET_NAME_NOMER = '
SELECT nomer FROM allnomer WHERE type = :type
';
// Константа. Запрос в таблицу main
const SQL_GET_MAIN = '
SELECT namenomer, datestart, dateend, numbernomer FROM main WHERE namenomer = :namenomer
';
// Константа. Добавление в таблицу main
const SQL_INSERT_MAIN = '
INSERT INTO main (namenomer, datestart, dateend, numbernomer) values (?, ?, ?, ?)
';

// PDO
try{
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Запрос в allnomer
$ftmt = $pdo->prepare(SQL_GET_NAME_NOMER);
$fres = $ftmt->execute([':type' => $nnomer]);
$frow = json_encode($ftmt->fetchAll(PDO::FETCH_OBJ));
// frow сейчас равен [{"nomer":"301"},{"nomer":"302"},{"nomer":"303"}]

// Запрос в main
$stmt = $pdo->prepare(SQL_GET_MAIN);
$sres = $stmt->execute([':namenomer' => $nnomer]);
$srow = json_encode($stmt->fetchAll(PDO::FETCH_OBJ)); // row сейчас равен 
// srow сейчас равен [{"namenomer":"lux","datestart":"2016-11-29","dateend":"2016-12-01","numbernomer":"301"},{"namenomer":"lux","datestart":"2016-12-01","dateend":"2016-12-02","numbernomer":"302"}]

// Вот здесь должена быть проверка ответа от main переменной $srow на совпадение диапазона дат $newdatestart и $newdateend

$numbernomer = "" // Здесь присваивается свободный номер. В нашем случае 302

// Добавление в таблицу main 
$addmt = $pdo->prepare(SQL_INSERT_MAIN);
$add = $addmt->execute([$nnomer, $datestart, $dateend, $numbernomer]);
} catch (PDOExeption $e) {
    exit($e->getMessage());
}

Подскажите, как сделать проверку на свободность номера, чтобы, в случае хотя бы одного совпадения, проверялся следующий номер? Вероятность того, что на этом этапе не найдётся ни одного свободного номера исключена. До этого этапа уже есть скрипт, который проверяет все номера на свободность. Однако он проверяет все номера. Этот же скрипт нужен для проверки определённых номеров.

P.S. Я уже создавал похожую тему с проверкой дат, но там была немного другая проверка. Изменить ту проверку дат на эту у меня не вышло. Поэтому прошу вашей помощи.
 
Если у нас максимальная и минимальная желаемые даты не пересекаются с датами существующей брони, то и всё что между ними тоже никак не пересечется.
Удобнее и быстрее всего решать полностью на SQL:
PHP:
SELECT namenomer, datestart, dateend, numbernomer
FROM main
WHERE namenomer = 'lux'
AND '2016-11-28' NOT BETWEEN datestart AND dateend
AND '2016-11-30' NOT BETWEEN datestart AND dateend
LIMIT 1
datestart, dateend - должны быть типа date
 
Если у нас максимальная и минимальная желаемые даты не пересекаются с датами существующей брони, то и всё что между ними тоже никак не пересечется.
либо я не понял ход мысли, либо лыжи не едут.
Первая пара: 2016-11-28 и 2016-11-30
Вторая пара: 2016-11-27 и 2016-11-29
Ни одна из дат не повторяется и не пересекается. Пересекаются только даты, которых мы не видим, которых нет в бд, но по сути они есть...
Удобнее и быстрее всего решать полностью на SQL:
Да и как же сделать всё на уровне SQL, если нужно работать с двумя таблицами? SELECT всегда обращается только к одной таблице, или я ошибаюсь? Мне-то главное присвоить записи номер, гостиничный номер.
 
Пересекаются только даты, которых мы не видим, которых нет в бд, но по сути они есть...
расшифруйте, пожалуйста... а то мозг чутка подвзорвался. даты, которые есть, но которых нет - это желаемые даты? тогда что не так со скриптом ув. latteo?
SELECT всегда обращается только к одной таблице, или я ошибаюсь?
JOIN - великая вещь.
 
Вот так сделал
PHP:
SELECT a.nomer
FROM allnomer a
LEFT JOIN main m ON
a.nomer = m.numbernomer AND (
m.datestart BETWEEN :datestart AND :dateend OR
m.dateend BETWEEN :datestart AND :dateend )
WHERE a.TYPE = :type AND m.id IS NULL
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху