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.

17voto

Moob Points 7627

Vous devriez vraiment utiliser un modèle Post Redirect Get pour gérer cela, mais si vous vous êtes retrouvé dans une position où PRG n'est pas viable (par exemple, le formulaire lui-même est dans un include, ce qui empêche les redirections), vous pouvez hacher certains des paramètres de la demande pour créer une chaîne basée sur le contenu et ensuite vérifier que vous ne l'avez pas déjà envoyée.

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

16voto

Ibu Points 17457

Lorsque le formulaire est traité, vous redirigez vers une autre page :

... process complete....
header('Location: thankyou.php');

vous pouvez également rediriger vers la même page.

si vous faites quelque chose comme des commentaires et que vous voulez que l'utilisateur reste sur la même page, vous pouvez utiliser Ajax pour gérer la soumission du formulaire.

15voto

Eugen Konkov Points 5218

J'ai trouvé la solution suivante. Vous pouvez échapper à la redirection après le traitement POST en manipulant les history objet.

Vous avez donc le formulaire HTML :

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

Lorsque vous traitez ce formulaire sur votre serveur, au lieu de rediriger l'utilisateur vers /the/result/page en mettant en place le Location l'en-tête comme celui-ci :

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

enter image description here

Après traitement POST ées que vous rendez petites <script> et le résultat /the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

Les <script> vous devez rendre :

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

Le résultat est le suivant :

enter image description here

comme vous pouvez le voir, les données du formulaire sont POST ée à process.php script.
Ce script processus POST données éditées et rendu /the/result/page en une seule fois avec :

  1. pas de redirection
  2. pas de re POST données lorsque vous rafraîchissez la page (F5)
  3. pas de re POST lorsque vous naviguez vers la page précédente/suivante à travers l'historique du navigateur

UPD

Comme autre solution, je demande demande de fonctionnalité les Mozilla FireFox pour permettre aux utilisateurs de mettre en place des NextPage qui fonctionnera comme suit Location et de faire de la post/redirect/get modèle obsolète.

En bref. Lorsque le formulaire de procédure du serveur POST avec succès :

  1. Mise en place NextPage au lieu de Location
  2. Rendre le résultat du traitement POST comme il le ferait pour les données du formulaire GET demande en post/redirect/get modèle

Le navigateur voit à son tour le NextPage l'en-tête :

  1. Ajuster window.location avec NextPage valeur
  2. Lorsque l'utilisateur actualise la page, le navigateur négocie GET demande à NextPage au lieu de re POST données du formulaire

Je pense que cette mesure serait excellente si elle était mise en œuvre. =)

9voto

Prasanth Bendra Points 9618
  1. Utiliser l'en-tête et rediriger la page.

    header("Location:your_page.php"); Vous pouvez rediriger vers la même page ou une autre page.

  2. Annuler $_POST après l'avoir inséré dans la base de données.

    unset($_POST);

7voto

Absolut Points 71

Un moyen assez sûr est de mettre en place un identifiant unique dans le message et de le mettre en cache dans le fichier

<input type='hidden' name='post_id' value='".createPassword(64)."'>

Ensuite, dans votre code, faites ceci :

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

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