как отменить повторную отправку формы php
Запретить/отключить повторную отправку формы php
Подробно о повторной отправке формы php
Пример повторной отправки формы
Разместим выше приведенный код прямо здесь:
Нажмите кнопку «Нажми на меня».
После перезагрузки страницы нажмите «F5».
Если вы нажмете «продолжить», то первые данные отправятся второй раз на сервер.
Если речь идет о комментариях, то тут появятся два абсолютно одинаковых комментария.
Как избавиться от «повторной отправки формы!?»
Отключаем повторную отправку формы php
Чтобы отключить «повторную отправку формы php» нам придется немного изменить код, который мы написали ранее.
Чем отличается выше приведенный код(в предыдущем пункте).
Создаем сессию «$_SESSION[example1]» и предаем туда данные из «_POST».
+ exit, чтобы программа дальше не пошла.
При перезагрузке проверяем существует ли сессия:
Соберем весь код отмены повторной отправки формы php
Как найду, так исправлю.
Если у вас тоже не срабатывает, то выделенное красным можно удалить.
Еще вариант отключения повторной отправки формы.
Как избавиться от повторной отправки формы? Для этого нам понадобится.
Сделать отдельную страницу, на которую произойдет переадресация после выполнения php.
Для вывода результата. тоже можно использовать сессию.
Об использовании этого варианта отключения повторной отправки формы?
Можно ли использовать такой вариант отключения повторной отправки формы? Вполне! Этот вариант
Как происходит процесс отключения повторной отправки формы в php?
Чтобы отключить повторную отправку формы через сторонний файл нам понадобится:
Пример формы, чтобы отправить первичный post запрос.
Чтобы не бродить по все странице ища результат выполнения скрипта, нам нужен якорь
Как работает отключение повторной отправки формы!?
Переходим к примеру. который отключит повторную отправку формы!
В поле ввода введите свой текст, либо оставьте так.
Нажмите кнопку Удали повторную отправку формы! :
После получения ответа. попробуйте нажать «F5».
Вы ничего не увидите, страница просто перезагрузится. му убрали повторную отправку формы!
Сообщение системы комментирования :
Форма пока доступна только админу. скоро все заработает. надеюсь.
Как отправить форму в php, чтобы она не отправлялась повторно, после обновления страницы
Доброе время суток, уважаемые HABRовчане!
Сегодня тема пойдет об отправке формы на html-страничке, чтобы, при повторном обновлении, она не отправлялась заново в БД.
Не знаю, было ли такое где-то на просторах интернета, но, когда я попыталась найти, а мне было жутко это нужно, причем очень срочно, то я столкнулась с кучей проблем.
Во первых, почти все источники предлагают делать это таким образом:
Но, проблема в нем следующая, если вы, уже где то в начале страницы отправили заголовки, то на вас будут ругаться, мол, «заголовки отправлены, зачем ты хочешь, чтобы я это сделал еще один раз, угомонись!»
Но данные способы были неудобны, возможно, вам покажется, что это наоборот, самый лучший вариант и зачем изобретать велосипед?
Меня же, все способы, встретившиеся на просторах интернета, не устроили. И я решила сделать то, что будет удобно мне и не будет занимать большое количество переменных/времени/ресурсов.
Приступим.
Для начала, создадим простенькую форму.
Затем добавим в форму метод отправки, действие и имя: Действие будет происходить на другой странице, для удобства и дальнейшей функциональности.
Получается вот такой код:
Затем, мы создаем файлик redir.php и работаем над ним:
Все. Как видите это просто, быстро и удобно!
Отмена повторной отправки формы
Мне часто задают вопросы относительно отмены повторной отправки формы. Например, Вы сделали форму добавления комментария, добавили обработчик на эту же страницу. Затем при добавлении комментария он успешно добавляется, но стоит пользователю нажать F5, как форма будет отправлена ещё раз. А F5 пользователь может легко нажать, если страница будет долго грузиться. В итоге, вместо 1-го комментария будет целых 2, а то и больше. В этой статье я покажу, как этого можно избежать.
Для начала разберём более подробно проблему на примере этого кода:
Нажав на кнопку «Возвести в квадрат«, Вы увидите результат работы скрипта. Но стоит после этого пользователю нажать F5, как скрипт снова будет выполняться. В данном случае, это не так критично, как с добавлением комментарием, однако, зачем нужна лишняя нагрузка на сервер?
А код страницы с формой теперь будет выглядеть так:
Подведу итог того, как отменить повторную отправку формы:
Вот так это делается в простых скриптах. Да и, в сложных, в конечном счёте делается то же самое.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 11 ):
Или написать в форме action=».»
При таком примере писать придется. Редирект убьет все POSTы
А я делал по проще: в форму добавил скрытый input, в котором храниться случайное число генерирующееся php. А также при генерации оно забивается в сессии. Затем при принятии формы сначала проверяется совпадение числа, и если нет совпадения форма не обрабатывается. Это как скрытая капча, которая сама вводиться
Я сделал так: if (isset($_POST[‘knopka’]))
А меня интересует совсем противоположный вопрос! А как зделать чтоб отправка формы продублировалясь три раза с интервалом в секунду! Какой обрабочик нужно добавить в код?
Здравствуйте. Не очень понял как делать. Изучаю Ваш курс основы PHP. Перепроверил код, но все равно при обновлении страницы комментарий дублируется. А у Вас на видео все нормально, без всяких редиректов. Вот сам код:
Добавить запись
Записи в гостевой книге:
Я конечно извиняюсь, но вы сами то запускали, тестили свои скрипты, во первых после нажатия и отправки запроса белый экран, результаты почему то выводятся в консоле, а во вторых это не работает, т.к. при обновлении данные отправляются повторно. Только что проверил!
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Веб-разработка
Как предотвратить повторную отправку сообщения из формы?
Многие начинающие веб-мастера задаются вопросом: «Как предотвратить повторную отправку данных из формы?». Очень часто вижу такие вопросы на форумах. В этой статье расскажу об легком и правильном способе решения этой проблемы.
Отправить заново
Допустим, мы делаем скрипт, который принимает данные из формы, переданные методом POST. Скрипт данные принял, обработал и выдал страницу с результатом. Но если пользователь вздумает обновить страницу в этот момент — он увидит сообщение такого плана:
Чтобы отобразить эту страницу, Firefox должен отправить информацию, которая повторит любое ранее произведённое действие (например, запрос на поиск или онлайн-покупка).
И две кнопки. Нажатие на одну из них отправит данные повторно, что часто нежелательно. Нажатие на вторую не произведет обновления страницы. В любом случае, пользователю не хорошо от такого сообщения. Пользователи вообще не очень любят всякие внезапно выскакивающие окошки.
Для начала, покажу скрипт, который мы будем дорабатывать.
Можете отправить форму один раз, а потом нажать Ctrl+R и увидеть злополучное окно. Давайте от него избавляться.
Но сперва слово спонсору поста — сайту с полезным контентом для телефонов Samsung, который предлагает темы для samsung gt s5230, обои и прочий стафф.
Предотвращение повторной отправки формы с помощью серверного редиректа
Чтобы предотвратить повторную отправку данных формы можно делать серверный редирект. Это делается путем посылки браузеру заголовка Location с нужным урл. Например, это должна быть страница с благодарностью за заполненную форму. Тогда мы напишем что-то в духе:
В этом случае сервер получит данные, обработает их и вместо показа результата отправит клиента на страницу, где этот результат будет показан.
Недостаток этого метода состоит в том, что пользователь может нажать кнопку «Назад» и вернуться на страницу с редиректом. Она снова швырнет его вперед и так пользователь с трудом сможет вернуться на две страницы назад, к форме, которую изначально заоплнял.
Предотвращение повторной отправки формы с помощью клиентского редиректа
Клиентский редирект называется клиентским потому что он происходит на стороне клиента. То есть в браузере. Клиентский редирект может происходить при помощи JavaScript и meta-тегов.
У JavaScript есть преимущество — он перезаписывает History браузера так, что даже если пользователь нажмет кнопку «Назад» браузера, он не вернется на страницу, которую отдал обработчик формы. То есть, окошко исчезнет капитально. Но JS у некоторых отключен.
У META-тегов, с другой стороны, есть преимущество в плане универсальности. Они редиректят всех и всегда.
Оптимально будет сочетать эти два способа. Как — описал Александр Шуркаев в заметке оптимальный редирект.
Используем его метод следующим образом.
Пробуем! Теперь, как видно, никакого окна не появляется. Что мы сделали? Мы проверили. Если данные пришли — мы выводим все необходимое для редиректа. В принципе, после этого уже можно даже делать exit, чтобы не грузить браузер лишними данными, которые все равно никто не увидит.
Как предотвратить повторную отправку формы при обновлении страницы (F5 / CTRL+R)
У меня есть простая форма, которая отправляет текст в моей таблице SQL. Проблема в том, что после того, как пользователь отправляет текст, они могут обновить страницу, и данные будут отправлены снова без повторного заполнения формы. Я мог бы перенаправить пользователя на другую страницу после отправки текста, но я хочу, чтобы пользователи оставались на той же странице.
Я помню, что читал что-то о предоставлении каждому пользователю уникального идентификатора сеанса и сравнении его с другим значением, которое решило проблему, которую я имею, но я забыл, где он находится.
18 ответов:
с помощью моего веб-сайта я сохраню сообщение в файле cookie или сеансе, перенаправлю после публикации, прочитаю файл cookie/сеанс, а затем очистите значение этой переменной сеанса или файла cookie.
Я также хотел бы отметить, что вы можете использовать подход javascript, window.history.replaceState чтобы предотвратить повторную отправку на кнопку Обновить и назад.
Я бы все равно рекомендовал подход Post/Redirect/Get, но это новое решение JS.
вы действительно должны использовать шаблон Post Redirect Get для обработки этого, но если вы каким-то образом оказались в положении, когда PRG нежизнеспособен (например, сама форма находится в include, предотвращая перенаправления), вы можете хэшировать некоторые параметры запроса, чтобы сделать строку на основе содержимого, а затем проверить, что вы ее еще не отправили.
вы можете повторно отправить форму через переменную сеанса, например
использовать заголовок и перенаправить страницу.
header(«Location:your_page.php»); вы можете перенаправить на ту же страницу или другую страницу.
когда форма обработана, вы перенаправляете на другую страницу:
вы также можете перенаправить на ту же страницу.
Если вы делаете что-то вроде комментариев и вы хотите, чтобы пользователь оставался на той же странице, вы можете использовать AJAX для обработки формы представления
довольно верный способ реализовать уникальный идентификатор в пост и кэшировать его в
тогда в вашем коде сделайте следующее:
Итак, у вас есть HTML-форма:
после обработки POST данные ЭД вы делаете небольшой
как вы можете видеть данные формы POST Эд process.php сценарий.
Этот скрипт процесс POST Эд данные и рендеринг /the/result/page сразу с:
в качестве другого решения я прошу запрос the Mozilla FireFox команда, чтобы позволить пользователям устанавливать NextPage заголовок, который будет работать как и сделать post/redirect/get шаблон устарел.
короче. Когда серверная форма процесса POST данные успешно это:
браузер, в свою очередь, когда вижу NextPage заголовок:
я думаю, что это было бы превосходно, если реализовали бы, не так ли? =)
просто перенаправьте его на ту же страницу после использования данных формы, и он работает. Я уже пробовал.
уточненная версия сообщения Moob. Создайте хэш сообщения, сохраните его как файл cookie сеанса и сравните хэши каждого сеанса.
после вставки его в базу данных, вызовите метод unset () для очистки данных.
unset ($_POST);
чтобы предотвратить вставку данных обновления, выполните перенаправление страницы на ту же страницу или другую страницу после вставки записи.
заголовок (‘Location:’.$_SERVER [‘PHP_SELF’]);
в принципе, вам нужно перенаправить с этой страницы, но это все еще может создать проблему, пока ваш интернет медленный (заголовок перенаправления с сервера)
пример базового сценария :
нажмите на кнопку Отправить дважды
на стороне клиента
в вашей html форме поставьте это:
Ps: Если вы используете форму Get, вы можете легко изменить все сообщения с GET, и это тоже работает.
Я использую эту строку javascript, чтобы заблокировать всплывающее окно с запросом на повторную отправку формы при обновлении после отправки формы.
просто поместите эту строку в нижний колонтитул вашего файла и увидеть магию
Использование шаблона Post / Redirect / Get из ответа Keverw-хорошая идея. Однако вы не можете оставаться на своей странице (и я думаю, что это было то, что вы просили?) Кроме того, это может иногда fail:
если веб-пользователь обновляется до завершения первоначальной отправки из-за задержки сервера, что приводит к дублированию запроса HTTP POST в некоторые агенты пользователей.
другой вариант будет хранить в сеансе, если текст должен быть записан в вашу базу данных SQL следующим образом:
Как говорили другие, невозможно выйти из использования post/redirect/get. Но в то же время это достаточно легко сделать, что вы хотите сделать на стороне сервера.
на странице POST вы просто проверяете пользовательский ввод, но не действуете на нем, вместо этого вы копируете его в массив сеанса. Затем вы снова перенаправляетесь на главную страницу отправки. Ваша главная страница отправки начинается с проверки наличия массива сеансов, который вы используете, и если да, то скопируйте его в локальный массив и снимите его. Оттуда вы можете действовать на него.
таким образом, вы только делаете всю свою основную работу один раз, добиваясь того, что вы хотите сделать.