javascript — сохранение номеров в приложении бронирования

У меня есть сайт для бронирования отелей.
Люди, которые имеют право, могут выбрать отель, даты и вместимость и оплатить заказ.

Когда клиент принимает решение и нажимает кнопку заказа, происходит несколько шагов:

  1. Проверка заявки еще раз для цены и сбора информации о заказе

  2. Экономия места для клиента для предотвращения перебронирования

  3. Таймер установлен на 5 минут для окна заказа клиента (если время прошло, комнаты освобождаются)

Если клиент выходит на страницу orger, запускается null_timer и
сохраненные комнаты освобождаются

Если клиент начинает заказ (на странице заказа), он не может обработать другой
заказы

  • $_SESSION['order_iddle'] а также таймер изменения, вызванные
    на стороне клиента через ajax

JS триггер

window.onbeforeunload = function(){

timer_null();
return "";

}

Проверка PHP

if ((!isset($_SESSION['order_iddle'])) || (!$_SESSION['order_iddle']) )  {

header('location: https://home-page/');

}
  • $_SESSION['order_iddle'] обновления с таймером в php.
  • timer_null() отправляет ajax-запрос на php для обновления / проверки таймера

Вопрос 1:

Эта логика опирается на onbeforeunload() функция, но если функция не работает в каком-либо браузере, у нас проблемы. Если есть лучший способ вызвать timer_null() когда пользователь уходит со страницы заказа? Может быть в PHP?

Вопрос 2:

когда onbeforeunload() триггеры и клики пользователей «Оставаться на странице», timer_null() сработал в любом случае.
Есть ли что-то делать с этим?

Спасибо)

0

Решение

Лучшим вариантом будет присвоить ордеру значение истечения в вашем бэкэнде. Таким образом вы избежите срабатывания, проблем, когда пользователи не используют JS, проблем, когда они остаются на странице и т. Д.

Когда они делают заказ, установите текущее время плюс количество минут:

$order['expiry'] = time() + (5 * 60); // sets an expiry time for 5 minutes (5x60 seconds)

Затем на будущей странице, которая проверяет, действителен ли заказ:

if (time() > $order['expiry']) {
throw new Exception('This order is not valid');
}

Поймайте это исключение и верните его пользователю, как вам захочется.

Предложения для более широкого использования

У вас могут быть другие вещи в вашем случае использования, которые требуют, например, хранения в течение этих пяти минут. Однако, если вы также включите этот срок в свое хранилище данных, его можно будет использовать для проверки истечения срока в любых будущих заказах.

Если вы не хотите проверять тысячи потенциально просроченных записей каждый раз при создании нового заказа, вы можете создать своего рода сценарий «очистки» для автоматического запуска. Если вы не использовали crontab прежде чем я предлагаю вам прочитать об этом, но сценарий должен запускаться каждый день в полночь с помощью crontab:

0 0 * * * php /var/www/my-clean-up-script.php

Затем в самом скрипте (псевдокод):

$expired_orders = database_query ( GET orders FROM table WHERE expired_time < current_time)
for each $expired_orders
database_query ( DELETE order)

Который должен работать для любого запрашиваемого хранилища данных.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]