У меня есть следующий код на моем сайте (с использованием 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, данные сообщения все еще там.
Есть идеи?
Ваш метод мог бы работать теоретически, но есть намного более простой способ.
После успешной отправки формы выполните перенаправление. Неважно, где, но это очистит $ _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):
в форме добавьте уникальный идентификатор (id + counter), не основанный на time () (!!!)
сообщение в отдельный файл (postform.php), который проверял сеанс с этим уникальным идентификатором
а) если сеанс с уникальным идентификатором НЕ был найден: сообщение в базу данных и заполнение сеанса с уникальным идентификатором
б) если был найден сеанс с уникальным идентификатором: ничего не делать
после перенаправления 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, который отключил бы кнопку отправки после первого щелчка.