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.

1voto

shawndfernandes Points 21

La variable $_POST['submit'] n'existera pas lors du chargement initial de la page, et curl ne pourra être exécuté que si la condition ci-dessous est vraie.

if($_POST['submit'] == "submit"){

// This is where you run the Curl code and display the output
  $curl = curl_init();

//clear $post variables after posting
$_POST = array();

}

0voto

Thinesh Points 281

Après l'avoir inséré dans la base de données, appelez la méthode unset() pour effacer les données.

unset($_POST) ;

Pour éviter l'insertion de données rafraîchies, redirigez la page vers la même page ou une page différente après l'insertion de l'enregistrement.

header('Location:'.$_SERVER['PHP_SELF']) ;

0voto

Adam Points 2731

L'utilisation du modèle Post/Redirect/Get de la réponse de Keverw est une bonne idée. Cependant, vous n'êtes pas en mesure de rester sur votre page (et je pense que c'est ce que vous demandiez ?). échouer :

Si un internaute actualise ses données avant la soumission initiale ha en raison d'un décalage du serveur, ce qui entraîne une double requête HTTP POST dans certains agents utilisateurs.

Une autre option serait de stocker dans une session si le texte doit être écrit dans votre base de données SQL comme ceci :

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0voto

Andreas Rex Points 25

I

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

I

0voto

Oleksii Semeniuk Points 146
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

$

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