Eviter la forme resoumettre en php en appuyant sur f5
J'ai le code suivant sur mon site (à l'aide de php et smarty) et essayez d'éviter une forme de soumettre à nouveau, quand j'appuie sur f5:
if ($this->bln_added == false) {
if (isset($_POST['submit'])) {
$this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']);
$this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']);
}
} else {
$this->obj_site->obj_smarty->assign('title', '');
$this->obj_site->obj_smarty->assign('desc', '');
unset($_POST);
}
bln_added est false par défaut, mais les changements de la vraie une fois le formulaire soumis avec succès. Les variables smarty le titre et les desc sont utilisés dans le modèle de garder le contenu du formulaire, au cas où il y a une erreur de l'utilisateur, et ils ont besoin de changer ce qu'ils sont entrés.
Si le formulaire est soumis avec succès il définit bln_added = true, alors la deuxième partie du code ne doit pas seulement effacer les champs du formulaire, mais aussi vide $_POST. Mais si j'appuie sur f5 les données post est toujours là.
Des idées?
source d'informationauteur wheresrhys
Vous devez vous connecter pour publier un commentaire.
Votre méthode pourrait fonctionner en théorie, mais il y a un moyen beaucoup plus facile.
Après la soumission du formulaire correctement, effectuer une redirection. Il n'est pas n'importe où, mais il sera clair que le $_POST.
Dans votre cas, il semble que vous voulez rediriger vers la page que vous êtes déjà sur. Ajouter un $_GET paramètre à l'URL si vous souhaitez afficher un message de confirmation.
Espère que cette aide,
Tom
La solution est un modèle communément connu comme Post/Redirect/Get
La meilleure façon de traiter les formulaires à utiliser l'auto-présentation et une redirection. Quelque chose comme ceci:
À l'aide de la CodeIgniter framework:
Vous pouvez réécrire votre formulaire de soumettre en AJAX. Si vous avez besoin de montrer HTML de contenu, de le renvoyer en format JSON et l'insérer avec JavaScript(jQuery par exemple).
J'ai résolu ce problème (en php) par:
dans le formulaire ajouter un identifiant unique (id+compteur) pas basé sur le temps() (!!!)
post dans un fichier séparé (postform.php) qui a vérifié pour une session avec un identifiant unique
a) si la session avec un identifiant unique n'a PAS été trouvé: post à la base de données et remplir session avec un identifiant unique
b) si la session avec un identifiant unique a été trouvé: ne rien faire
après 3a/3b rediriger vers la page de résultat avec header('location: http://mydomain.com/mypage')
Résultat est le suivant:
pas de soumettre de nouveau les actions sur actualiser/backbutton et seulement soumettre de nouveau à l'avertissement sur double cliquez sur bouton retour (mais pas de la soumettre de nouveau à l'action)
Utiliser l'en-Tête de l'emplacement après le succès de l'action post
Ça marche pour moi, si j'utilise soit de l'en-tête() ou exit() à la fin de mon code, par exemple, après que j'ai enregistrer certaines données.
La meilleure méthode que j'ai trouvé est à l'aide de javascript et de css. Commune de php méthode de redirection header('location: http://www.yourdomain.com/url); fonctionnera, mais Il cause d'avertissement "Warning: Cannot modify header information - headers already sent" dans les différents frameworks et cms comme wordpress, drupal, etc. Donc, ma suggestion est de suivre le code ci-dessous
Le style de la balise est important sinon l'utilisateur peut se sentir comme la page chargé à deux reprises. Si nous utilisons le style de la balise avec le corps de l'affichage aucun et puis actualisez la page , puis l'expérience de l'utilisateur sera comme même que le php header('location: ....);
J'espère que cela aidera 🙂
En-tête de redirection après le post est nécessaire, mais insuffisant.
En PHP côté après la soumission du formulaire correctement, effectuer une redirection. Par exemple. header('location: http://www.example.com/form.php');
Mais il n'est pas assez. Certains utilisateurs de la presse liens deux fois (double-clic). JavaScript est nécessaire qui permettrait de désactiver le bouton "soumettre" après le premier clic.
Essayer la mienne, peut-être que ce n'est pas la meilleure solution (vite fait), mais je l'ai tester et il fonctionne. Testé sur Chrome. Cliquez pour voir à quoi il ressemble BR