Отменить почтовые переменные после отправки формы

Есть ли способ сделать это? В принципе, я не хочу, чтобы форма была отправлена ​​снова, если кто-то нажмет обновление после того, как он уже отправил форму один раз. В этом случае браузер запрашивает, вы хотите отправить форму еще раз. Будет ли 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, которая не позволяет отправлять сообщения, не делая перехват. Это то, что я использовал, и оно отлично работает.