Избегание повторной отправки формы в 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, данные сообщения все еще там.
Любые идеи?
Ответы
Ответ 1
Ваш метод может работать теоретически, но там гораздо проще.
После успешной отправки формы выполните перенаправление. Неважно, где это сделать, но он очистит $_POST.
header('Location: http://www.example.com/form.php');
В вашем случае это похоже на то, что вы хотите перенаправить на страницу, на которой вы уже находитесь. Добавьте URL-адрес $_GET в URL-адрес, если вы хотите отобразить подтверждающее сообщение.
Надеюсь, что это поможет,
Tom
Ответ 2
Решение представляет собой шаблон, обычно известный как Post/Redirect/Get
Ответ 3
Лучший способ обработки форм - использовать самообучение и перенаправление. Что-то вроде этого:
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.
Используя Framework 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');
}
Ответ 4
Вы можете переписать форму-submit на AJAX-путь. Если вам нужно показать HTML-контент, верните его в формате JSON и вставьте с помощью JavaScript (например, jQuery).
Ответ 5
Я решил это (в php):
-
в форме добавьте уникальный идентификатор (id + counter), не основанный на time() (!!!)
-
отправить в отдельный файл (postform.php), который проверял сеанс с этим уникальным идентификатором
-
a) если сеанс с уникальным идентификатором не найден: сообщение в базу данных и заполнение сеанса с уникальным идентификатором
b) если был найден сеанс с уникальным идентификатором: ничего не делать
-
после перенаправления 3a/3b на страницу результатов с заголовком ('Местоположение: http://mydomain.com/mypage')
Результат:
не выполнять повторные действия ни на обновление, ни на перезагрузку, а только повторно отправить предупреждение на двойной щелчок (но не повторить действие)
Ответ 6
Использовать расположение заголовка после успешного действия post
header('Location: '.$_SERVER['HTTP_REFERER']);
Ответ 7
Он работает для меня, если я использую либо заголовок(), либо exit() в конце моего кода, например, после сохранения некоторых данных.
Ответ 8
Лучший метод, который я нашел, - использование javascript и css. Общий заголовок метода php redirection ('Местоположение: 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 ("Местоположение:....);
Надеюсь, это поможет:)
Ответ 9
Переадресация заголовка после сообщения необходима, но недостаточно.
На стороне PHP после отправки формы выполните перенаправление. Например. header ('Местоположение: http://www.example.com/form.php');
Но этого недостаточно. Некоторые пользователи дважды нажимают ссылки (doubleclick). Требуется JavaScript, который отключил бы кнопку отправки после первого щелчка.
Ответ 10
Попробуйте мой собственный, возможно, это не лучшее решение (сделано быстро), но я тестировал его, и он работает. Протестировано в Chrome. Нажмите, чтобы посмотреть, как он выглядит BR
<?php
session_start(); // Start session
?>
<html>
<head>
<title>
Test
</title>
</head>
<body>
<form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form"><br>
</form>
<?php
if(isset($_POST['submit']))
{
$_SESSION['name'] = $_POST['name']; // Assign $_POST value to $_SESSION variable
header('Location: refresh.php'); // Address of this - reloaded page - in this case similar to PHP_SELF
} else session_destroy(); // kill session, depends on what you want to do / maybe unset() function will be enough
if(isset($_SESSION['name']))
{
$name = $_SESSION['name'];
echo "User Has submitted the form and entered this name : <b> $name </b>";
echo "<br>You can use the following form again to enter a new name.";
}
?>
</body>
</html>