Html как убрать подтверждение повторной отправки формы

от admin

Отмена повторной отправки формы

Мне часто задают вопросы относительно отмены повторной отправки формы. Например, Вы сделали форму добавления комментария, добавили обработчик на эту же страницу. Затем при добавлении комментария он успешно добавляется, но стоит пользователю нажать F5, как форма будет отправлена ещё раз. А F5 пользователь может легко нажать, если страница будет долго грузиться. В итоге, вместо 1-го комментария будет целых 2, а то и больше. В этой статье я покажу, как этого можно избежать.

Для начала разберём более подробно проблему на примере этого кода:

<?php
if (!empty($_POST[«sqr»])) <
echo «Квадрат числа «.$_POST[«x»].» равен «.pow($_POST[«x»], 2);
>
?>
<form name=»form» action=»» method=»post»>
<div>
<input type=»text» name=»x» />
<br />
<input type=»submit» value=»Возвести в квадрат» name=»sqr» />
</div>
</form>

Нажав на кнопку «Возвести в квадрат«, Вы увидите результат работы скрипта. Но стоит после этого пользователю нажать F5, как скрипт снова будет выполняться. В данном случае, это не так критично, как с добавлением комментарием, однако, зачем нужна лишняя нагрузка на сервер?

Теперь поговорим о способах решения данной проблемы. Первый способ — выделить скрипт обработки в отдельный файл. Тогда в атрибуте action у тега form надо добавить путь к этому скрипту. А сам скрипт должен сохранять куда-нибудь результат своих действий, либо переменные пришедшие на скрипт, а после делать редирект обратно. В общем, смотрите код скрипта:

<?php
session_start();
$_SESSION[«x»] = $_POST[«x»];
header(«Location: «.$_SERVER[«HTTP_REFERER»]);
exit;
?>

А код страницы с формой теперь будет выглядеть так:

<?php
session_start();
if (isset($_SESSION[«x»])) echo «Квадрат числа «.$_SESSION[«x»].» равен «.pow($_SESSION[«x»], 2);
>
?>
<form name=»form» action=»request.php» method=»post»>
<div>
<input type=»text» name=»x» />
<br />
<input type=»submit» value=»Возвести в квадрат» name=»sqr» />
</div>
</form>

Недостаток этого подхода очевиден — приходится создавать ещё один файл для такого простого скрипта. Поэтому рассказываю и про второй способ, как можно избежать повторной отправки формы:

<?php
session_start();
if (!empty($_POST[«sqr»])) <
$_SESSION[«x»] = $_POST[«x»];
header(«Location: «.$_SERVER[«REQUEST_URI»]);
exit;
>
if (isset($_SESSION[«x»])) echo «Квадрат числа «.$_SESSION[«x»].» равен «.pow($_SESSION[«x»], 2);
?>
<form name=»form» action=»» method=»post»>
<div>
<input type=»text» name=»x» />
<br />
<input type=»submit» value=»Возвести в квадрат» name=»sqr» />
</div>
</form>

Здесь обработка снова происходит в этом же файле, но ключевое отличие — это наличие редиректа на эту же страницу в конце. В результате, страница перегрузится после отправки формы и браузер при нажатии F5 не будет предлагать пользователю отправить форму ещё раз.

Подведу итог того, как отменить повторную отправку формы:

  • Либо делать обработку в отдельном файле, а затем оттуда делать редирект назад.
  • Либо делать обработку в том же файле, что и форма, но при этом после обработки делать редирект на ту же страницу.

Вот так это делается в простых скриптах. Да и, в сложных, в конечном счёте делается то же самое.

Как избежать повторной отправки формы при обновлении?

Дело в том, что после отправки пост запроса скрипт принимает отправленные данные, проверяет их на корректность (валидность, заполненность обязательных данных и т.д.) и выдает ответ – либо операция прошла успешно, либо произошла ошибка и список ошибок (например: ошибка — поле «имя» не заполнено. А на странице отправки уже в свою очередь выдается соответствующее сообщение: отправка успешна или не успешна.

Так вот есть ли элегантный вариант предотвратить повторную отправку формы? Например мне пришла идея что если в javascript поймать событие обновления страницы(если такова есть отменить её и просто сделать переход по текущей ссылке. Или если можно на сервере после получении данных POST запроса удалить какие нибудь информацию о запросе может она не будет повторно отправляться так как данные удалены?

А еще редирект не вариант. Так как после редиректа я не могу передать ответ скрипта.

А еще махинации с дополнительным полем с уникальным значением сохраненным на сессии и дальнейшая их проверка тоже крайний вариант.

Как исправить подтверждение повторной отправки формы при ошибке обновления

Если вы заполняете онлайн-форму и она включает собственный ответ, который вы вводите непосредственно в браузере, рекомендуется скопировать и сохранить его в файл перед отправкой формы. Это связано с тем, что в случае сбоя отправки формы по какой-либо причине введенные вами данные могут быть потеряны. Некоторые формы сохраняют информацию, которую вводит пользователь, а другие — нет.

Исправить Подтвердить повторную отправку формы при обновлении

Подтверждение повторной отправки формы при ошибке обновления означает, что при отправке формы информация не была отправлена ​​на сервер, на который она должна была быть отправлена. Это может быть проблема с вашей стороны, например, вы не подключены к Интернету или ваше Интернет-соединение нестабильно и прерывается до того, как информация может быть отправлена. Это может быть проблема на стороне веб-сайта, т. Е. Сервер не отвечает, анализ данных занимает слишком много времени, сервер ожидает другие данные и т. Д.

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

1. Проверьте сеанс браузера.

Сеанс вашего браузера может быть одной из причин, по которой вы видите сообщение об ошибке Подтверждение повторной отправки формы при обновлении. Сообщение может появиться в любом браузере с немного другим языком, однако убедитесь;

Вы не используете окно просмотра в режиме инкогнито
Вы не обновляете форму вручную после нажатия кнопки «Отправить / отправить».
У вас не установлены приложения или расширения, которые могут прервать сеанс, например VPN, монитор сетевого трафика, прокси, переключатель агента пользователя и т. Д.

Читать:
Как вывести звук с материнской платы

Если ошибка не исчезнет, ​​стоит использовать другой браузер, чем тот, который вы используете. Используйте современный браузер, например Chrome или Opera, вместо Firefox или Safari. Если вы видите эту ошибку в мобильном браузере, переключитесь на браузер для настольных компьютеров.

2. Удалите данные браузера и повторите попытку.

Проблема подтверждения повторной отправки формы при обновлении может быть на стороне сервера, поскольку сервер находится под большой нагрузкой, когда одновременно с отправкой отправляется слишком много форм. Вы можете попробовать подождать, пока сервер не перегрузится, но тем временем очистите данные браузера и попробуйте отправить форму еще раз.

Очистить данные браузера в Chrome;

Откройте Chrome.
Нажмите кнопку «Дополнительные параметры» в правом верхнем углу и выберите «Настройки».
В разделе «Конфиденциальность и безопасность» нажмите «Очистить данные просмотра».
Выберите Файлы cookie и другие данные просмотра и Кэширование изображений и файлов.
Щелкните Очистить данные.

Fire Fox

Чтобы очистить данные просмотра в Firefox;

Откройте Firefox.
Нажмите кнопку «Дополнительные параметры» в правом верхнем углу и выберите «Настройки».
Перейдите в раздел Конфиденциальность и безопасность.
Щелкните Очистить данные.
Выберите Файлы cookie и данные сайта и Кэшированный веб-контент.
Щелкните Очистить данные и перезапустите браузер.
Отправьте форму еще раз.

3. Отключите расширения браузера.

Расширения браузера могут мешать сеансу браузера и отправке формы. Если вы считаете, что с формой или веб-сайтом, на котором вы отправляете данные, все в порядке, отключите все установленные расширения и повторите попытку.

Отключить расширения в Chrome;

Откройте Chrome.
Нажмите кнопку дополнительных параметров в правом верхнем углу и выберите Дополнительные инструменты> Расширения.
Выключите переключатель рядом с каждым добавочным номером.

Fire Fox

Чтобы отключить надстройки в Firefox;

Откройте Firefox.
Нажмите кнопку «Дополнительные параметры» в правом верхнем углу и выберите «Надстройки и темы».
Выключите переключатель рядом с каждой надстройкой.

4. Исправьте Подтверждение повторной отправки формы при обновлении для администраторов веб-сайтов.

Эти исправления применимы, если вы можете редактировать код формы. Подтверждение повторной отправки формы при обновлении появляется в одном из двух случаев, если на вашем сервере нет проблем.

POST против GET

Формы PHP могут отправлять данные одним из двух способов; POST или GET. Если вы используете метод POST, вы столкнетесь с ошибкой подтверждения повторной отправки формы при обновлении, тогда как вы не увидите ее с помощью метода GET.

Это означает, что существует проблема с тем, как команда POST была добавлена ​​в форму, или что пользователь обновляет форму перед ее отправкой. Метод POST следует использовать только в случае необходимости, например, с полями сброса пароля, а не с полями обычных форм.

Отключить подтверждение повторной отправки в браузере

Браузеры могут использовать собственные проверки форм. Обычно это функция, но вы можете заставить страницу игнорировать проверку браузера. Для этого вы можете использовать форму AJAX. Вы по-прежнему сможете использовать с ним функцию POST, если не хотите переключаться на GET.

Заключение

Ошибка подтверждения повторной отправки формы при обновлении может появиться, если вы обновите форму перед ее отправкой. Если вы видите ошибку при отправке формы, более чем вероятно, что проблема на стороне сервера. Возможно, это не в ваших силах исправить.

Боремся с сообщением о повторной отправке формы

Итак, однажды я встраивал на сайт одну хитрую форму, состоящую из нескольких шагов. Если в этой форме заполнить не все обязательные поля, то будет выведено сообщение об ошибке и просьба нажать в браузере « назад » и заполнить-таки необходимые поля. Вот такое странное представление о юзабилити. Нехитрая команда « назад » прекрасно выполнялась на старом месте жительства формы, а вот на новом сайте (на битриксе), она вызывала подозрительное окошко вот такого вида:

To display this page, Firefox must send information that will repeat any action (such as a search or order confirmation) that was performed earlier.

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

в IE это целый трактат

Веб-страница просрочена

и только Opera искренне заботится о нервах пользователя и послушно грузит страницу из кэша, не задавая никаких лишних вопросов.

Что ж, давайте разбираться.

Из описания ошибки в FF и Chrome’е становится ясно, что возникает она при отправке формы. Если быть точнее, то ошибка возникает, если мы пытаемся вернуться на страницу, на которую изначально попали, используя post-запрос. Чтобы было понятнее, я нарисовал картинку:

Схема возникновения ошибки

А теперь самый интересный вопрос: почему ошибка возникает не всегда? Как я писал выше, на старом сайте можно было вернуться назад без всяких дурацких сообщений про повторную отправку. С подачи моего коллеги Антона, было установлено, что во всём виновато кэширование, а точнее, заголовки, регламентирующие кэширование в браузере. Оказывается, если заголовками запрещается кэширование страницы, и переход на неё изначально был сделан post-запросом, то просто так вернуться на неё уже не получится. Дальнейшие эксперименты показали, что во всём виноват один заголовок Cache-Control . Чтобы исправить ситуацию, достаточно просто убрать этот его.

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

Вся эта фигня приведёт к тому, что все браузеры будут вести себя подобно Opera — они будут возвращаться на предыдущую страницу, не делая запрос на сервер, а беря содержимое из кэша. Плохо это или хорошо — решайте сами.

Уф. я написал столько текста ради одной строчки в .htaccess , надо бы приучить себя к лаконичности.

Похожие статьи