250 votes

Comment empêcher la resoumission d'un formulaire lorsque la page est rafraîchie (F5 / CTRL+R) ?

J'ai un formulaire simple qui soumet du texte à ma table SQL. Le problème est qu'après avoir soumis le texte, l'utilisateur peut rafraîchir la page et les données sont à nouveau soumises sans que le formulaire ne soit à nouveau rempli. Je pourrais rediriger l'utilisateur vers une autre page après la soumission du texte, mais je veux que les utilisateurs restent sur la même page.

Je me souviens avoir lu quelque chose sur le fait de donner à chaque utilisateur un identifiant de session unique et de le comparer à une autre valeur qui a résolu le problème que je rencontre, mais j'ai oublié où c'était.

299voto

dtbaker Points 353

J'aimerais également souligner que vous pouvez utiliser une approche javascript, window.history.replaceState pour éviter une nouvelle soumission lors d'un rafraîchissement ou d'un retour en arrière.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

Preuve de concept ici : https://dtbaker.net/files/prevent-post-resubmit.php (Le lien ne fonctionne plus)

Je recommanderais toujours une approche Post/Redirect/Get, mais il s'agit d'une nouvelle solution JS.

135voto

Keverw Points 911

Utilisez le modèle Post/Redirect/Get. http://en.wikipedia.org/wiki/Post/Redirect/Get

Sur mon site web, je stocke un message dans un cookie ou une session, je redirige après le message, je lis le cookie/session, puis j'efface la valeur de cette variable de session ou de cookie.

35voto

Savoo Points 524

Vous pouvez empêcher la resoumission du formulaire au moyen d'une variable de session.

Vous devez d'abord définir rand() dans une zone de texte et $_SESSION['rand'] sur la page du formulaire :

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

Vérifier ensuite $_SESSION['rand'] avec zone de texte $_POST['randcheck'] valeur comme suit :

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

Assurez-vous de démarrer la session sur chaque fichier avec lequel vous l'utilisez. session_start()

30voto

Mo'men Mohamed Points 841

I

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

J

19voto

Tanmoy Datta Points 1032

T

T


J

T

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X