За последние 24 часа нас посетили 32959 программистов и 1821 робот. Сейчас ищут 878 программистов ...

Повторная отсылка формы

Тема в разделе "Прочие вопросы по PHP", создана пользователем waterman, 31 июл 2011.

  1. waterman

    waterman Активный пользователь

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Добрый день! Подскажите, пожалуйста, решение такой проблемы. Пользователь заполняет форму, жмет ОТПРАВИТЬ (метод POST), затем скрипт обрабатывает и INSERT'ом вставляет в базу. Но тут косяк: если в браузере нажать "обновить" или F5, то добавляется одна и та же запись. Положил гирьку на F5 и сервак упал от переизбытка чувств (записей). Как избежать повторной отсылки формы? Уже специально очищаю массив $_POST. Вот выдержка из кода
    Код (Text):
    1. function insert_thing(){
    2.    if (!empty($_POST)) {INSERT (я тут не расписываю, не в этом суть)}
    3.    $_POST=array();
    4.    }
    Т.е. вставляю в базу и очищаю $_POST, однако, он ни фига не очищается! And so on and on!
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ты очищаешь POST в предыдущем запуске скрипта. После F5 браузер заново вызывает скрипт и заново пересылает пост запрос.
    Как вариант при вставке данных выводить сообщение типа "Спасибо, ваш пост добавлен" и перенаправлять в нужное место. Можно и не выводить ничего, а просто сразу перенаправлять.
     
  3. jenya777777

    jenya777777 Активный пользователь

    С нами с:
    16 мар 2010
    Сообщения:
    562
    Симпатии:
    0
    используй переадрессацию header или meta refresh
     
  4. waterman

    waterman Активный пользователь

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Редирект - это хорошо! А как быть с кнопками ВПЕРЕД НАЗАД в БРАУЗЕРАХ. Если пользователь нажмет НАЗАД на странице с результатами о добавлении, то значения введенные в inputax никуда не деваются, жмём ДОБАВИТЬ и вуаля - та же самая запись опять идёт в базу, но уже под другим номером. То же и с кнопкой ВПЕРЕД. Ведь при нажатии на эти кнопки не происходит загрузка страницы, следовательно, не отрабатывают никакие скрипты!!! Как отследить такое поведение?
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Если это POST запрос, то при нажатии назад/вперёд происходит перезагрузка страницы.
    А что ты хочешь? Пользователь, если захочет - всё равно напишет ещё раз тоже самое и нажмёт добавить. Захочет - и 100 раз так сделает.
    Можешь перед добавлением новой записи в б.д. проверять что там уже в базе.
     
  6. waterman

    waterman Активный пользователь

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    А можно сделать редирект на страницу с помощью POST-запроса? с GET всё понятно:

    Код (Text):
    1. header("Location: add_thing_result.php?res=$res[0]&id=$res[1]);
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну если заморочиться, то на JavaScript можно сделать авто-submit POST-формы по событию onload, например. Только, мне кажется, ты чё-то не то хочешь сделать.
     
  8. waterman

    waterman Активный пользователь

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Блин, уже и кэш запретил, всё равно не помогает!
    Код (Text):
    1. session_cache_limiter('nocache');
    Придется действительно проверять инфу перед добавлением в базу.
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Там не в сессиях дело. И вообще никак с php не связано. Это браузер запоминает предыдущие значения полей форм и подставляет в них значения. Наверно.
     
  10. goodie

    goodie Активный пользователь

    С нами с:
    20 апр 2010
    Сообщения:
    4
    Симпатии:
    0
    вам ненадо заморачиваться и проверять , повторно ли отправлены данные. После отправки формы на многих сайтах делается редирект на другую страницу с помощью php (header("Location: index.php")), либо если асинхронный запрос - то с помощью javascript (document.location.href="index.php").
    Это наиболее простой и быстрый вариант.
     
  11. waterman

    waterman Активный пользователь

    С нами с:
    18 июл 2011
    Сообщения:
    22
    Симпатии:
    0
    Я и так делаю редирект на страницу с результатами, но пользователь-то может нажать в браузере кнопку НАЗАД, а затем опять нажать ОТПРАВИТЬ ФОРМУ, страница опять перенаправиться на страницу с результатами. Будет занесена повторно одна и та же информация. Вопрос, как отследить нажатие кнопок ВПЕРЕД, НАЗАД(В этом случае нет перезагрузки страницы). Редирект не спасет! Как заметил sobachnik,
    .
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768