web-dev-qa-db-fra.com

Annuler les variables de publication après la soumission du formulaire

Y at-il un moyen de faire ce qui précède? En gros, je ne veux pas que le formulaire soit soumis à nouveau si quelqu'un appuie sur l'actualisation après avoir déjà soumis le formulaire une fois. Dans ce cas, le navigateur vous demande si vous souhaitez soumettre le formulaire à nouveau. unset($_POST['username']) sera-t-il d'une quelconque aide dans ce cas?

10
roopunk

Le post/redirection/get est une bonne option car certaines affiches l’ont déjà mentionné. 

Un autre moyen auquel je peux penser est de définir une session dans la page dostuff.php pour indiquer que la publication a déjà été effectuée. Vérifiez cette session var à chaque fois pour voir si la page est chargée à nouveau en raison d'un rafraîchissement de la page.

<?php
    session_start();
    if(isset($_SESSION['indicator'])) 
    {
        /*
        dont do anything because session indicator says 
        that the processing was already done..

        you might want to redirect to a new url here..          
        */
    }   
    else
    {

        /*
        first set session indicator so that subsequent 
        process requests will be ignored
        */
        $_SESSION['indicator'] = "processed"; 

        //process the request here..
    }
    ?>

Dans la page que vous redirigez, désactivez la session var afin que le formulaire puisse être soumis à nouveau, ce qui en fait une nouvelle opération de publication. Cela autorisera les nouvelles publications de formulaire mais empêchera les opérations de publication en raison de l'actualisation de la page.

10
raidenace

Utilisez une page intermédiaire pour effectuer les opérations, puis redirigez.

Par exemple:

mypage.php -> la page avec le formulaire

dostuff.php -> reçoit les données du formulaire et effectue des opérations, puis redirige vers une autre page.

Pour faire une redirection:
Placez cette ligne au-dessus de "dostuff.php": header("Location: mypage.php");

3
Pedro L.

Utilisez ce code

    if(isset($_POST)){
      header('location:'.$_SERVER['PHP_SELF']);
      die();
     }
2
Vijay Sankar

Le problème auquel vous faites face ci-dessus peut (et devrait) être résolu avec Post/Redirect/Get . Désactiver _POST du côté php serait inefficace car le problème est qu’il s’agit d’une requête séparée.

Vous devez également gérer le double-clic sur les boutons de soumission. Vous pouvez résoudre ce problème côté client en désactivant l'envoi du formulaire après un clic sur le bouton ou en plaçant un jeton aléatoire dans le formulaire et en stockant ce jeton dans la session. Le jeton ne sera accepté qu'une fois (la session note si le jeton a été posté).

2
Explosion Pills

Voici une méthode intéressante que j'utilise pour empêcher les utilisateurs de soumettre deux fois les mêmes données, ce qui empêchera également la page d'ajouter le même enregistrement à la base de données lors du rechargement.

// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) { 
    echo 'You already entered that.';
} else {
    // Second IF
    if ($_POST['comment_body']) {

        // Run your query here

    $_SESSION['dup_comment_body'] = $_POST['comment_body']; 
    header('location:'.$_SERVER['REQUEST_URI'].'');
    }
} 

La première IF vérifie si le $_POST est égal à la dernière chose tapée ($_SESSION). Si ce n'est pas le même, il exécute la prochaine variable IF pour vérifier si la variable $_POST n'est pas vide. Dans la dernière IF vers le bas, $_SESSION['dup_comment_body'] est égal à $_POST. Ainsi, la prochaine fois que la première IF sera exécutée et que le $_POST sera identique, ils recevront le message "Vous avez déjà entré cela.". J'espère que cela t'aides!

1
user1661548

Si votre formulaire doit mettre à jour une base de données, vous pouvez alors mettre à jour ou insérer uniquement si l'enregistrement n'existe pas. Faites simplement une déclaration select en premier. Cela empêchera les enregistrements en double dus à l'actualisation.

0
Robert