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.

7voto

SevenHell Points 67

J

T

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

4voto

skibulk Points 684

Une version améliorée de l'article de Moob. Créer un hachage du POST, le sauvegarder en tant que cookie de session, et comparer les hachages à chaque session.

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

3voto

krsoni Points 339

Il suffit de le rediriger vers la même page après avoir utilisé les données du formulaire, et cela fonctionne. J'ai essayé.

header('location:yourpage.php');

2voto

ZenithS Points 824

En fait, vous devez rediriger cette page, mais cela peut encore poser un problème lorsque votre internet est lent (Redirect header from serverside).

Exemple de scénario de base :

Cliquez deux fois sur le bouton d'envoi

Comment résoudre le problème ?

  • Côté client

    • Désactiver le bouton de soumission une fois que le client a cliqué dessus
    • Si vous utilisez Jquery : Jquery.one
    • Modèle PRG
  • Côté serveur

    • Utilisation de l'horodatage par hachage différencié / de l'horodatage de l'envoi de la demande.
    • Utiliser des jetons de demande. Lorsque le système principal se charge, il attribue un jeton de demande temporaire qui, s'il est répété, est ignoré.

2voto

Comment empêcher la resoumission d'un formulaire php sans redirection. Si vous utilisez $_SESSION (après session_start) et un formulaire $_POST, vous pouvez faire quelque chose comme ceci :

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

Dans votre formulaire html, mettez ceci :

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

Ainsi, chaque fois que le formulaire est soumis, un nouvel acte est généré, stocké dans la session et comparé à l'acte post.

Ps : si vous utilisez un formulaire Get, vous pouvez facilement remplacer tous les POST par des GET et cela fonctionne aussi.

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