Как запретить повторную отправку форму после f5?

12
SEO_87
На сайте с 05.08.2008
Offline
104
9986

Есть такая форма:

<?php
//Если форма отправлена
if(isset($_POST['submit'])) {

//Проверка поля ИМЯ
if(trim($_POST['contactname']) == '') {
$hasError = true;
} else {
$name = trim($_POST['contactname']);
}

//Проверка наличия телефона
if(trim($_POST['email']) == '') {
$hasError = true;
} else {
$email = trim($_POST['email']);
}

//Если ошибок нет, отправить email
if(!isset($hasError)) {
$emailTo = 'xxxx@mail.ru'; //Получатель
$myname = 'admin@yandex.ru'; //Ящик, выступающий отправителем
$body = "Имя: $name \nТелефон: $email \n\n$model";
$subject ="Заказ";
$headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $myname;
mail($emailTo, $subject, $body, 'From:'.$myname. "\r\n" . "MIME-Version: 1.0\r\nContent-type: text/plain; charset=utf-8");
//mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}
}

?>
<div class="popup">
<h2>спасибо за заявку</h2>
<p>в ближайшее время с вами свяжутся</p>
</div><!-- END popup -->
<span class="warning">личные данные заполнены неверно</span>
<form class="contact_form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
<input type="text" name="contactname" />
<input type="text" name="email" />
<?php if(isset($hasError)) { //Если найдены ошибки ?>
<style>.warning{display: block;}</style>
<?php } ?>
<?php if(isset($emailSent) && $emailSent == true) { //Если письмо отправлено ?>
<style>.overlay,.popup{display: block;}</style>
<?php } ?>
<input type="submit" value="Отправить" name="submit" />
</form><!-- END contact_form -->

После отправки формы при нажатии f5 письмо отправляется повторно. Через location не получается пофиксить, так как надо выводить всплывающие сообщения. Есть другие способы?

LEOnidUKG
На сайте с 25.11.2006
Offline
1770
#1

- Установка куки

- ввод каптчи

- отправка через ajax

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
SEO_87
На сайте с 05.08.2008
Offline
104
#2

А можно подробней про установку куки? ) Я уже пробовал, но ничего не получилось.

LEOnidUKG
На сайте с 25.11.2006
Offline
1770
#3
SEO_87:
А можно подробней про установку куки? ) Я уже пробовал, но ничего не получилось.

Ну когда отправляете форму, куку ставите и всё. После загрузки страницы она и уже установлена. Если жать F5 то опять проверяем на эту куку, если уже установлена то ничего не делаем.

Куку можно установить минут на 15-30, не знаю какая у вас задача.

SEO_87
На сайте с 05.08.2008
Offline
104
#4

На сайте несколько разных форм, поэтому блокировать юзера по времени не вариант.

LEOnidUKG
На сайте с 25.11.2006
Offline
1770
#5
SEO_87:
На сайте несколько разных форм, поэтому блокировать юзера по времени не вариант.

Ну типа разные куки установить никак? :)

Можно в сессию записывать, тоже самое. Какая форма и когда была отправлена.

C
На сайте с 04.02.2005
Offline
291
#6

отдавать не 200, а 301 редирект.

SEO_87
На сайте с 05.08.2008
Offline
104
#7

<?php

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

//Проверка поля ИМЯ
if(trim($_POST['contactname']) == 'ваше имя') {
$hasError = true;
} else {
$name = trim($_POST['contactname']);
}

//Проверка наличия телефона
if(trim($_POST['email']) == 'номер телефона') {
$hasError = true;
} else {
$email = trim($_POST['email']);
}

//Если ошибок нет, отправить email
if(!isset($hasError)) {
$emailTo = 'pmpmontajer@mail.ru'; //Получатель
$myname = 'admin@yandex.ru'; //Ящик, выступающий отправителем
$body = "Имя: $name \nТелефон: $email \n\n$model";
$subject ="Заказ: Видеосъемка свадьбы";
$headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $myname;
mail($emailTo, $subject, $body, 'From:'.$myname. "\r\n" . "MIME-Version: 1.0\r\nContent-type: text/plain; charset=utf-8");
//mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}
setcookie(‘FormSubmitted’, ’1′);
}
}
?>

Не хочет кука ставится

siv1987
На сайте с 02.04.2009
Offline
427
#8

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

SEO_87
На сайте с 05.08.2008
Offline
104
#9

При редиректе не получится же показывать всплывающие сообщения.

siv1987
На сайте с 02.04.2009
Offline
427
#10

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

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий