Избегание повторной отправки формы в php при нажатии f5

У меня есть следующий код на моем сайте (с использованием php и smarty), чтобы попытаться избежать повторной отправки формы, когда я ударил f5:

if ($this->bln_added == false) { if (isset($_POST['submit'])) { $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']); $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']); } } else { $this->obj_site->obj_smarty->assign('title', ''); $this->obj_site->obj_smarty->assign('desc', ''); unset($_POST); } 

bln_added по умолчанию является ложным, но изменяется на true после успешной отправки формы. Заголовки переменных smarty и desc используются в шаблоне, чтобы сохранить содержимое формы там, если есть ошибка пользователя, и им нужно изменить то, что они ввели.

Если форма успешно отправлена, она устанавливает bln_added = true, поэтому второй бит кода должен не только очищать поля формы, но и пустые $ _POST. Но если я нажму f5, данные сообщения все еще там.

Есть идеи?

Related of "Избегание повторной отправки формы в php при нажатии f5"

Ваш метод мог бы работать теоретически, но есть намного более простой способ.

После успешной отправки формы выполните перенаправление. Неважно, где, но это очистит $ _POST.

 header('Location: http://www.example.com/form.php'); 

В вашем случае это похоже на то, что вы хотите перенаправить на страницу, на которой вы уже находитесь. Добавьте URL-адрес $ _GET в URL-адрес, если вы хотите отобразить сообщение с подтверждением.

Надеюсь это поможет,

Том

Решение – это шаблон, обычно известный как Post / Redirect / Get

Лучшим способом обработки форм является использование самостоятельной подачи и перенаправления. Что-то вроде этого:

 if (isset($_POST)) { // Perform your validation and whatever it is you wanted to do // Perform your redirect } // If we get here they didn't submit the form - display it to them. 

Использование рамки CodeIgniter :

 function index() { $this->load->library('validation'); // Your validation rules if ($this->form_validation->run()) { // Perform your database changes via your model redirect(''); return; } // The form didn't validate (or the user hasn't submitted) $this->load->view('yourview'); } 

Вы можете переписать форму-submit на AJAX-путь. Если вам нужно показать HTML-контент, верните его в формате JSON и вставьте с помощью JavaScript (например, jQuery).

Я решил это (в php):

  1. в форме добавьте уникальный идентификатор (id + counter), не основанный на time () (!!!)

  2. сообщение в отдельный файл (postform.php), который проверял сеанс с этим уникальным идентификатором

  3. а) если сеанс с уникальным идентификатором НЕ был найден: сообщение в базу данных и заполнение сеанса с уникальным идентификатором

    б) если был найден сеанс с уникальным идентификатором: ничего не делать

  4. после перенаправления 3a / 3b на страницу результатов с заголовком («Местоположение: http://mydomain.com/mypage »)

Результат:
не повторно отправлять действия на обновление / откидывание и только повторно указывать предупреждение на двойном щелчке (но не повторять действие)

Использовать расположение заголовка после успешного действия после публикации

 header('Location: '.$_SERVER['HTTP_REFERER']); 

Он работает для меня, если я использую либо заголовок (), либо exit () в конце моего кода, например, после сохранения некоторых данных.

Лучший метод, который я нашел, – использование javascript и css. Общий заголовок метода перенаправления php («Местоположение: http://www.yourdomain.com/url ); будет работать, но он вызывает предупреждение «Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки» в разных рамках и cms, таких как wordpress, drupal и т. д. Поэтому мое предложение состоит в том, чтобы следовать приведенному ниже коду

 echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit; 

Тег стиля важен, иначе пользователь может почувствовать, что страница загружена дважды. Если мы используем тег стиля с дисплеем тела none, а затем обновляем страницу, то пользовательский интерфейс будет таким же, как и заголовок php («Местоположение: ….);

Я надеюсь, это поможет 🙂

Переадресация заголовка после сообщения необходима, но недостаточна.

На стороне PHP после отправки формы выполните перенаправление. Например. header («Местоположение: http://www.example.com/form.php »);

но этого не достаточно. Некоторые пользователи дважды нажимают ссылки (doubleclick). Требуется JavaScript, который отключил бы кнопку отправки после первого щелчка.