Есть ли способ сделать это? В принципе, я не хочу, чтобы форма была отправлена снова, если кто-то нажмет обновление после того, как он уже отправил форму один раз. В этом случае браузер запрашивает, вы хотите отправить форму еще раз. Будет ли unset($_POST['username'])
какой-либо помощи в этом случае?
Отменить почтовые переменные после отправки формы
Ответ 1
Post/redirect/get - хороший вариант, о котором уже упоминалось в некоторых плакатах.
Другим способом, который я могу представить, является установка сеанса на странице dostuff.php, чтобы указать, что проводка уже выполнена. Проверяйте этот сеанс var каждый раз, чтобы узнать, загружается ли страница снова из-за обновления страницы.
<?php
session_start();
if(isset($_SESSION['indicator']))
{
/*
dont do anything because session indicator says
that the processing was already done..
you might want to redirect to a new url here..
*/
}
else
{
/*
first set session indicator so that subsequent
process requests will be ignored
*/
$_SESSION['indicator'] = "processed";
//process the request here..
}
?>
На странице, на которую вы перенаправляете, отключите сеанс var, чтобы форма могла быть повторно отправлена повторно заново, что сделало ее новой пост-операцией. Это позволит создавать новые записи в форме, но предотвратит последующие операции из-за обновления страницы.
Ответ 2
Используйте промежуточную страницу для выполнения операций, а затем перенаправляйте.
Например:
mypage.php → страница с формой
dostuff.php → получает данные формы и выполняет операции, затем перенаправляется на любую другую страницу.
Сделать перенаправление:
Поместите эту строку вверху "dostuff.php": header("Location: mypage.php");
Ответ 3
Используйте этот код
if(isset($_POST)){
header('location:'.$_SERVER['PHP_SELF']);
die();
}
Ответ 4
Проблема, с которой вы столкнулись выше, может (и должна) быть решена с помощью Post/Redirect/Get. Отмена _POST
на стороне php была бы неэффективной, так как проблема в том, что это отдельный запрос.
Вам также нужно иметь дело с двойным щелчком кнопок отправки. Вы можете решить эту проблему на стороне клиента, отключив отправку формы после нажатия кнопки или помещая случайный токен в форму и сохраняя этот токен в сеансе. Токен будет приниматься только один раз (сеанс отслеживает, был ли токен опубликован).
Ответ 5
Вот хороший метод, который я использую для того, чтобы пользователи не отправляли одни и те же данные дважды, что также предотвратит добавление одной и той же записи в базу данных при перезагрузке.
// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) {
echo 'You already entered that.';
} else {
// Second IF
if ($_POST['comment_body']) {
// Run your query here
$_SESSION['dup_comment_body'] = $_POST['comment_body'];
header('location:'.$_SERVER['REQUEST_URI'].'');
}
}
Первый IF
проверяет, соответствует ли $_POST
последнему, что они набрали ($_SESSION
). Если это не то же самое, он запускает следующий IF
, чтобы проверить, не является ли переменная $_POST
пустой. Внутри последнего IF
по направлению к нижней части он устанавливает $_SESSION['dup_comment_body']
равным $_POST
. Поэтому в следующий раз, когда выполняется первый IF
, а $_POST
будет таким же, они получат сообщение "Вы уже ввели это". Надеюсь, это поможет!
Ответ 6
Для этого вам нужно использовать шаблон POST/REDIRECT/GET.
Ответ 7
Мое решение для этого выполняет метаобновление, если задана переменная post, $_POST не следует за ней после обновления.
<head>
<?php
if (isset($_POST['Task'])){
echo' <meta http-equiv="refresh" content="0; url=./ThisFile.php">';
}
?>
</head>
Ответ 8
Вместо этого вы можете использовать капчу, такую как Recaptcha, которая не позволяет отправлять сообщения, не делая перехват. Это то, что я использовал, и оно отлично работает.