Есть ли способ сделать это? В принципе, я не хочу, чтобы форма была отправлена снова, если кто-то нажмет обновление после того, как он уже отправил форму один раз. В этом случае браузер запрашивает, вы хотите отправить форму еще раз. Будет ли unset($_POST['username'])
какая-нибудь помощь в этом случае?
Сообщение / переадресация / получение – хороший вариант, как уже упоминалось в некоторых плакатах.
Другим способом, который я могу представить, является установка сеанса на странице 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, чтобы снова можно было повторно отправить форму заново, сделав ее новой пост-операцией. Это позволит создавать новые записи в форме, но предотвратит почтовые операции из-за обновления страницы.
Используйте промежуточную страницу для выполнения операций, а затем перенаправление.
Например:
mypage.php -> страница с формой
dostuff.php -> получает данные формы и выполняет операции, затем перенаправляет на любую другую страницу.
Чтобы сделать перенаправление:
Поместите эту строку в верхнюю часть header("Location: mypage.php");
«dostuff.php»: header("Location: mypage.php");
Проблема, с которой вы столкнулись выше, может (и должна) быть решена с помощью Post / Redirect / Get . Снятие _POST
на стороне php было бы неэффективным, так как проблема в том, что это отдельный запрос.
Вам также придется иметь дело с двойным щелчком кнопок отправки. Вы можете решить эту проблему на стороне клиента, отключив отправку формы после нажатия кнопки или помещая случайный токен в форму и сохраняя этот токен в сеансе. Токен будет приниматься только один раз (сеанс отслеживает, был ли токен опубликован).
Используйте этот код
if(isset($_POST)){ header('location:'.$_SERVER['PHP_SELF']); die(); }
Вот хороший метод, который я использую для того, чтобы пользователи не отправляли одни и те же данные дважды, что также предотвращает добавление одной и той же записи в базу данных при перезагрузке.
// 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
тот же, они получат сообщение «Вы уже ввели это». Надеюсь это поможет!
Для этого вам нужно использовать шаблон POST / REDIRECT / GET.
Мое решение для этого выполняет мета-обновление, если переменная post установлена, $ _POST не следует за ней после обновления.
<head> <?php if (isset($_POST['Task'])){ echo' <meta http-equiv="refresh" content="0; url=./ThisFile.php">'; } ?> </head>
Вместо этого вы можете использовать капчу, такую как Recaptcha, которая не позволяет отправлять сообщения, не делая перехват. Это то, что я использовал, и работает отлично.