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?
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.
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");
Utilisez ce code
if(isset($_POST)){
header('location:'.$_SERVER['PHP_SELF']);
die();
}
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é).
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!
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.