Простой способ избавиться от повторной отправки данных формы

Допустим у вас есть скрипт вида:

<?
if ($_REQUEST['action']=='add')
{
  // записываем что-то в БД
}
>?
<html>
<body>
<form method='post'>
  <input type='hidden' name='action' value='add'/>
  <input name='var1'/><br/>
  <input name='var2'/><br/>
  <input type='submit' value='Отправить'/>
</form>
</body>
</html>

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

Как легко избежать этого? Очень просто, нужно доработать скрипт, дополнив его одной строкой:

header("Location: <путь к скрипту>");

Это строку следует записывать сразу после действия, например:

<?
if ($_REQUEST['action']=='add')
{
  // записываем что-то в БД
  header("Location: script.php");
}
?>
<html>
<body>
<form method='post'>
  <input type='hidden' name='action' value='add'/>
  <input name='var1'/><br/>
  <input name='var2'/><br/>
  <input type='submit' value='Отправить'/>
</form>
</body>
</html>

Т.е. после отправки формы, выполниться только действие, после чего страница перезагрузится уже без данных этой формы и кнопка "назад" браузера не будет повторять отправку.

Такой вот простой способ.

p.s. Важно помнить, что функция header() будет работать только в тех местах скрипта, где еще не начался вывод данных в поток браузера, т.е. до HTML-вставок, функций echo(), print() и т.п.

Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Google Plus
Опубликовать в LiveJournal

3 thoughts on “Простой способ избавиться от повторной отправки данных формы

  1. А если нужно вывести результат выполнения скрипта, допустим "Ваши данные успешно отправлены", приходится прибегать к кукам или сессии. А если не использовать ни куки, ни сессии, ни ajax, каким образом можно предотвратить повторную отправку данных???

    • Мне кажется, что без сессии и куки - только через промежуточную страницу тогда.

Добавить комментарий для Виталий Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *