Фев 14

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

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

<?
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() и т.п.