PHP: Как предотвратить повторную отправку формы.

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

Предотвращение множественной отправки с Javascript

Вероятно, использование Javascript для предотвращения повторной отправки формы является самым легким способом. Когда пользователь отправляет форму, можно отключить кнопку «Отправить» и изменить её название на что-либо более понятное «Идет отправка, пожалуйста, подождите…»

Первым шагом является задание уникального идентификатора id, например id=»myButton»:

<input type=»submit» value=»Submit» id=»myButton» />

Вторым (и последним) шагом является задание двух Javascript команд в теге <form>. Первая команда будет отключать кнопку «Отправить» после отправки формы, а вторая будет изменять текст кнопки, чтобы дать пользователю представление о том, что происходит. Следующий код нужно добавить в тег <form>:

onsubmit=»document.getElementById(‘myButton’).disabled=true;

document.getElementById(‘myButton’).value=’Идет отправка, пожалуйста, подождите..’;»

Тег form будет выглядеть следующим образом:

<form action=»contact.php» method=»post»

onsubmit=»document.getElementById(‘myButton’).disabled=true;

document.getElementById(‘myButton’).value=’Идет отправка, пожалуйста, подождите..’;»

>

А после нажатия кнопка превратиться в такую

Вот и всё. Данный прием должен работать на большинстве браузеров (IE 5+, FireFox, Opera, Chrome).

Предотвращение множественной отправки с использованием Cookies

Если вы хотите избежать повторной отправки форм на протяжении всей сессии браузера (или дольше), то можете рассмотреть возможность использования cookies. Например, изменить свой сценарий редактирования формы для передачи cookie браузеру после обработки формы, но до отправки HTML заголовков. Размещение данного кода после команды mail() должно работать в большинстве случаев:

setcookie(‘FormSubmitted’, ‘1’);

Затем проверьте cookie перед обработкой. Если они уже созданы, то пользователь уже отправил форму в активной сессии браузера. Добавьте следующий код в начале сценария для обработки формы.

if (isset($_COOKIE[‘FormSubmitted’])
{
die(‘Вы может отправить форму только один раз за сессию!’);
}

Вот и всё.

Вот как будет выглядеть окончательная версия сценария с использованием cookie для блокирования повторной отправки. Обратите внимание, что часть кода была добавлена вверху сценария, а код для записи cookie находится после функции mail().

<?php

/* Предотвращение повторной отправки */

if (isset($_COOKIE[‘FormSubmitted’])
{
show_error(‘Вы может отправить форму только один раз за сессию!’);
}

/* Установка получателя e-mail */

$myemail = «you@domain.com»;

/* Проверка введенных на форме значений с помощью функции check_input function */

$yourname = check_input($_POST[‘yourname’], «Введите ваше имя»);
$subject = check_input($_POST[‘subject’], «Тема сообщения»);
$email = check_input($_POST[’email’]);
$website = check_input($_POST[‘website’]);
$likeit = check_input($_POST[‘likeit’]);
$how_find = check_input($_POST[‘how’]);
$comments = check_input($_POST[‘comments’], «Ваши комментарии»);

/* Если введен неправильный адрес e-mail, показать сообщение об ошибке */
if (!preg_match(«/([w-]+@[w-]+.[w-]+)/», $email))
{
show_error(«Вы ввели неправильный E-mail»);
}

/* Если URL неправильный, устанавливаем пустое значение для переменной $website */
if (!preg_match(«/^(https?://+[w-]+.[w-]+)/i», $website))
{
$website = »;
}

/* Подготовим e-mail сообщение */

$message = «Hello!
Ваши контактные данные отправлены:
Name: $yourname
E-mail: $email
URL: $website
Нравится ли веб-сайт? $likeit
Как вы нашли веб-сайт? $how_find
Комментарии:
$comments
Конец сообщения
«;

/* Отправить сообщение с помощью функции mail() */

mail($myemail, $subject, $message);

/* Устанавливаем cookie для предотвращения повторной отправки */
setcookie(‘FormSubmitted’, ‘1’);

/* Направляем пользователя на страницу благодарности */
header(‘Location: thanks.htm’);

exit();

/* Используемые функции */

function check_input($data, $problem=»)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
if ($problem && strlen($data) == 0)
{
show_error($problem);
}
return $data;
}
function show_error($myError)
{
?>
<html>
<body>
<b>Исправьте следующую ошибку:
<?php echo $myError; ?>
</body>
</html>
<?php
exit();
}

?>


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

Эта запись была опубликована в рубрике PHP кусочки, Полезное для w мастеров и отмечена метками , , . Добавить в закладки ссылку.

6 в ответ на PHP: Как предотвратить повторную отправку формы.:

  1. lazorg пишет:

    Спасибо, отличная статья — добавлю в закладки.

  2. Егор пишет:

    У меня под Perl в html форме этот скрипт не работает. Обычный HTML. НЕ php Для скрипта наверное разницы не должно быть?

  3. baobab пишет:

    В примере с JavaScript. После отсылки формы кнопка вернется в первоначальное состояние?

  4. Иван пишет:

    Решил проблему при помощи куки. — Благодарю.

Добавить комментарий