двойная отправка при обновлении php

Я пытаюсь исправить проблему двойной отправки в моем сценарии. Когда я нажимаю «Отправить», он обновляет mysql только один раз (это то, что я хочу). Однако, когда я нажимаю «Обновить», он снова обновляет mysql. Кажется, что оператор if игнорируется после нажатия кнопки обновления. Что бы я сделал, чтобы остановить это

вот мой код

if (isset($_POST['submitButton'])) { 
//do something
 }


<form action = "table.php" method="post">
<label for="submitButton"></label>
<input type="submit" name="submitButton" id="submitButton"
value="Submit Form"/>
</form>

person Aaron    schedule 16.08.2011    source источник


Ответы (5)


Когда вы обновляете страницу - сообщение ОТПРАВЛЕНО ПОВТОРНО

Некоторые браузеры даже предупреждают вас об этом.

Чтобы предотвратить это, я делаю:

if (isset($_POST['submitButton'])) { 
//do something

//..do all post stuff
header('Location: thisPage.php'); //clears POST
}


<form action = "table.php" method="post">
<label for="submitButton"></label>
<input type="submit" name="submitButton" id="submitButton"
value="Submit Form"/>
</form>
person Naftali aka Neal    schedule 16.08.2011
comment
Я бы предпочел использовать csrf-токен в форме, чем создавать 2 запроса на отправку, но я должен сказать, что это довольно изящный и простой в реализации трюк. Может быть, умереть(); после заголовка(); ? - person edorian; 17.08.2011

Я использую сеанс, чтобы не делать репост.

session_start();

 if( isset($_SESSION['your_variable']) && 
     $_SESSION['your_variable'] == $_POST['your_variable'] ){
    // re-post, don't do anything. 
 }
 else{
    $_SESSION['your_variable'] = $_POST['your_variable'];
    // new post, go do something.
 } 
person Yipyo Ai    schedule 30.01.2012

Это стандартное поведение: когда вы перезагружаете страницу, если она была опубликована, ваш браузер повторяет тот же запрос (с POST).

Чтобы избежать этого, вы можете использовать перенаправление на ту же страницу с помощью:

 <?php
 header("location:".$mycurrentURl);

Это перезагрузит страницу через запрос на получение. Это предотвратит дублирование постов.

person Benjamin Dubois    schedule 16.08.2011

при обновлении страницы. браузер снова публикует все данные. так что то же самое происходит снова, чтобы преодолеть это после того, как что-то перенаправит браузер на ту же страницу еще раз, как это

    if (isset($_POST['submitButton'])) { 
         //do something

         header("location:table.php");
    }
person Ujjwal Manandhar    schedule 16.08.2011

Обычно я не беспокоюсь об этом и просто полагаюсь на то, что пользователь НЕ публикует повторно, если он этого не хочет. Однако, если вы хотите запретить это, вы можете использовать одноразовый номер.

http://en.wikipedia.org/wiki/Cryptographic_nonce

person Kevin Nelson    schedule 16.08.2011