За последние 24 часа нас посетили 19306 программистов и 1615 роботов. Сейчас ищут 1032 программиста ...

Удаление данных при уходе с сайта

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 29 окт 2017.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ребят у меня на сайте есть запись по календарю на время и что бы не получилось так когда первый который кликнул на время допустим 30.10.17 12:45 и попал на страницу заполнения данных и пока он не заполнит полностью данные и не нажмет кнопку записаться то второй может кликнуть на этоже время и записаться раньше первого я это решил тем что бронирурую время уже при клике на время и в сессии храню id записи а потом просто обновляю ее но тут проблема если человек кликнул на время и ушел с сайта то оно так и остается на половину пустым и будет висяк. Как решить данную проблему какие идеи.
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Можно сделать так, установи время для юзера на заполнения данных ну например 2 минуты, если он по времени не успел заполнить форму, уничтожай сессию, вот и все.
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    На клиенте в JS ловим событие "beforeunload" и отправляем Ajax-запрос на снятие брони. Стоит учитывать, что событие сработает как при закрытии страница, так и при переходе на другую страницу. Для большей уверенности, делайте Ajax-запрос синхронный, хотя у меня и с асинхронным проблем не возникало. И можно сюда же прикрутить то, что посоветовал @_ne_scaju_, но только опять же сделать реализацию на клиенте: таймер отслеживающий активность: mousemove, keydown, scroll - вполне достаточно. Если в течении N минут ни одно событие не произошло, то выполняем такой-же Ajax-запрос, а после его завершения редиректим юзера на какую-то другую страницу сайта.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Или не бронировать так. А нормально - по заполнению формы и проверкой не занято ли уже
     
  5. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Не вариант. Вот ты представь он выбрал время которое было свободно перешел к заполнению и сидит минут 10 тут пока он сидит кто то на это время записался и он отправляет данные ему в ответ время занято он подумает что сайт не работает потому что было ведь свободно и уйдет. Короче не варик. А вот те что выше вариант.

    я вот пробовал через beforeunload но у меня чето не получилось ну не отправлялся запрос может действительно нужно асинхроно попробовать. а можно ваш пример как вы делали может что то не правильно писал. Моего уже нет так как просто тестил и не получилось удалил.
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Под рукой есть с использованием jQuery. Подойдёт?
    Код (Javascript):
    1. var idleTimer = null,
    2.   idleWait = 1000 * 60 * 5; // 5 минут неактивности
    3. // Отслеживание активности пользователя
    4. $(document).on('mousemove keydown scroll', function() {
    5.   clearTimeout(idleTimer);
    6.   idleTimer = setTimeout(function() {
    7.     // По истечении idleWait-времени, перенаправляем на другую страницу
    8.     location.href = 'http://natribu.org/';
    9.   }, idleWait);
    10. }).trigger('mousemove');
    11.  
    12. // Снятие брони
    13. $(window).on('beforeunload', function() {
    14.   $.ajax({
    15.     url: '/path/to/handler.php', // путь к обработчику
    16.     type: 'POST',
    17.     async: false,
    18.     data: {
    19.       action: 'removeReserve' // какая-нибудь метка
    20.     }
    21.   });
    22. });
    Чуть подправил под вашу задачу, но не тестировал
     
    Dron-Boy нравится это.
  7. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    да пойдет спасибо
    --- Добавлено ---
    Слушай а befunload должен выполняться в document.ready ?
    и еще такой вопрос а если это просто обновление страници вот я написал твой код в doument.ready все работает указал async false. А как отследить обновление страници если он просто обновил страницу то тоже запись затирается
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Нет, не обязательно
    Понятное дело. Пробуйте так
    Код (Javascript):
    1. var idleTimer = null,
    2.   idleWait = 1000 * 60 * 5, // 5 минут неактивности
    3.   isRefresh = false; // флаг: обновление страницы или нет
    4.  
    5. $(document).on('mousemove keydown scroll', function(e) {
    6.   clearTimeout(idleTimer);
    7.   idleTimer = setTimeout(function() {
    8.     // По истечении idleWait-времени, перенаправляем на другую страницу
    9.     location.href = 'http://natribu.org/';
    10.   }, idleWait);
    11.   if (e.type === 'keydown' && e.which === 116) {
    12.     isRefresh = true;
    13.   }
    14. }).trigger('mousemove');
    15.  
    16. // Снятие брони
    17. $(window).on('beforeunload', function() {
    18.   if (isRefresh) {
    19.     return false;
    20.   }
    21.   $.ajax({
    22.     url: '/path/to/handler.php', // путь к обработчику
    23.     type: 'POST',
    24.     async: false,
    25.     data: {
    26.       action: 'removeReserve' // какая-нибудь метка
    27.     }
    28.   });
    29. });
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
  10. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    неа все ровно затирает при перезагрузке(
    а это на ф5 повешено событие тогда норм. Нов вот при нажатии в браузере на кнопку перезагрузить всеровно затирает.
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Это действительно проблема и пока идей нет.
     
  12. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    я вот написал так

    Код (Javascript):
    1. if (isRefresh || loc.indexOf("/zakaz/?")) {
    2.                     return false;
    3.                 }
    --- Добавлено ---
    и работает в loc собираю
    Код (Javascript):
    1. var loc = window.location.pathname;
    2.                   loc = loc+''+window.location.search;
    --- Добавлено ---
    только создавать нужно переменную в событии beforeunload что бы она обновлялась.
    --- Добавлено ---
    я вот чуток потестил как то через раз работает