J'ai un formulaire simple qui soumet du texte à ma table SQL. Le problème est qu'après que l'utilisateur a soumis le texte, il peut actualiser la page et les données sont à nouveau soumises sans remplir à nouveau le formulaire. Je pourrais rediriger l'utilisateur vers une autre page une fois le texte soumis, mais je souhaite 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 avec une autre valeur qui a résolu le problème que je rencontre, mais j'ai oublié où il se trouve.
POST
demandePOST
les données. Dans ce cas, vous en avez besoinSELECT
depuis DB. Par exemple, lorsque vous créez la facture, vous êtes redirigé vers/invoices/53
lequel afficher la facture entière au lieu de simplement "succès"Réponses:
Utilisez le modèle Post / Redirection / Get. http://en.wikipedia.org/wiki/Post/Redirect/Get
Avec mon site Web, je vais stocker un message dans un cookie ou une session, rediriger après la publication, lire le cookie / session, puis effacer la valeur de cette session ou variable de cookie.
la source
Je tiens également à souligner que vous pouvez utiliser une approche javascript,
window.history.replaceState
pour empêcher une nouvelle soumission sur le bouton d'actualisation et de retour.Preuve de concept ici: https://dtbaker.net/files/prevent-post-resubmit.php
Je recommanderais toujours une approche Post / Redirection / Get, mais il s'agit d'une nouvelle solution JS.
la source
Vous devriez vraiment utiliser un modèle Post Redirect Get pour gérer cela, mais si vous vous êtes retrouvé dans une position où PRG n'est pas viable (par exemple, le formulaire lui-même est dans un include, ce qui empêche les redirections), vous pouvez hacher certains des paramètres de la requête pour créer une chaîne basée sur le contenu, puis vérifiez que vous ne l'avez pas déjà envoyée.
la source
session_start();
au début du fichier. w3schools.com/php/php_sessions.asp dit Remarque: La fonction session_start () doit être la toute première chose dans votre document. Avant toute balise HTML.J'utilise cette ligne javascript pour bloquer la fenêtre contextuelle demandant une nouvelle soumission de formulaire lors de l'actualisation une fois le formulaire soumis.
Placez simplement cette ligne au pied de votre fichier et voyez la magie
la source
Vous pouvez empêcher la nouvelle soumission de formulaire via une variable de session.
Vous devez d'abord définir
rand()
dans une zone de texte et$_SESSION['rand']
sur la page du formulaire:Après cela, vérifiez
$_SESSION['rand']
avec la$_POST['randcheck']
valeur de la zone de texte comme ceci:la source
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
place$_POST
les données du formulaire, la même page se recharge en réinitialisant les variables de session et de publication. La création de variables doit également avoir lieu après avoir vérifié si les variables correspondent. Ceunset
n'est donc pas nécessaire.Lorsque le formulaire est traité, vous redirigez vers une autre page:
vous pouvez également rediriger vers la même page.
si vous faites quelque chose comme des commentaires et que vous voulez que l'utilisateur reste sur la même page, vous pouvez utiliser Ajax pour gérer la soumission du formulaire
la source
J'ai trouvé la prochaine solution de contournement. Vous pouvez échapper à la redirection après le traitement de la
POST
demande en manipulant l'history
objet.Vous avez donc le formulaire HTML:
Lorsque vous traitez ce formulaire sur votre serveur, vous au lieu de rediriger l'utilisateur vers
/the/result/page
en configurant l'en-Location
tête comme ceci:Après avoir traité les
POST
données ed, vous rendez petit<script>
et le résultat/the/result/page
Le
<script>
vous devriez rendre:Le résultat est:
comme vous pouvez le voir, les données du formulaire sont
POST
éditées enprocess.php
script.Ce script a traité les
POST
données et le rendu/the/result/page
à la fois avec:POST
données lorsque vous actualisez la page (F5)POST
lorsque vous accédez à la page précédente / suivante dans l'historique du navigateurUPD
Comme autre solution, je demande à l' équipe Mozilla FireFox de demander aux utilisateurs de configurer un en-
NextPage
tête qui fonctionnera comme un en-Location
tête et rendra lepost/redirect/get
modèle obsolète.En bref. Lorsque le serveur traite
POST
correctement les données du formulaire :NextPage
tête de configuration au lieu deLocation
POST
données du formulaire comme il le rendrait pour laGET
demande dans lepost/redirect/get
modèleLe navigateur à son tour quand voir l'en-
NextPage
tête:window.location
avecNextPage
valeurGET
demande auNextPage
lieu de reformuler lesPOST
donnéesJe pense que ce serait excellent si mis en œuvre, n'est-ce pas?
=)
la source
Utilisez l'en-tête et redirigez la page.
header("Location:your_page.php");
Vous pouvez rediriger vers la même page ou une page différente.Désélectionnez $ _POST après l'avoir inséré dans la base de données.
unset($_POST);
la source
unset
? Veuillez ajouter une explication à votre réponse afin que d'autres puissent en tirer des leçonsUn moyen assez sûr est d'implémenter un identifiant unique dans la publication et de le mettre en cache dans le
Ensuite, dans votre code, procédez comme suit:
la source
Cette méthode fonctionne bien pour moi, et je pense que c'est la plus simple pour faire ce travail.
L'idée générale est de rediriger l'utilisateur vers d'autres pages après la soumission du formulaire, ce qui arrêterait la nouvelle soumission du formulaire lors de l'actualisation de la page. Néanmoins, si vous devez maintenir l'utilisateur sur la même page après l'envoi du formulaire, vous pouvez le faire de plusieurs manières, mais je décris ici la méthode javascript.
Méthode Javascript
Cette méthode est assez simple et bloque la fenêtre contextuelle demandant une nouvelle soumission du formulaire lors de l'actualisation une fois le formulaire soumis. Placez simplement cette ligne de code javascript au pied de votre fichier et voyez la magie.
la source
Javascript
Cette méthode est assez simple et bloque la fenêtre contextuelle demandant une nouvelle soumission du formulaire lors de l'actualisation une fois le formulaire soumis. Placez simplement cette ligne de code javascript au pied de votre fichier et voyez la magie.
la source
Redirigez-le simplement vers la même page après avoir utilisé les données du formulaire, et cela fonctionne. J'ai essayé.
la source
Une version raffinée du post de Moob. Créez un hachage du POST, enregistrez-le en tant que cookie de session et comparez les hachages à chaque session.
la source
Fondamentalement, vous devez rediriger hors de cette page, mais cela peut toujours poser un problème lorsque votre connexion Internet ralentit (rediriger l'en-tête depuis le serveur)
Exemple de scénario de base:
Cliquez deux fois sur le bouton Soumettre
Façon de résoudre
Côté client
Du côté serveur
la source
Comment empêcher une nouvelle soumission de formulaire php sans redirection. Si vous utilisez $ _SESSION (après session_start) et un formulaire $ _POST, vous pouvez faire quelque chose comme ceci:
Dans votre formulaire html, mettez ceci:
Ainsi, à chaque fois que le formulaire est soumis, un nouvel acte est généré, stocké en session et comparé au post acte.
Ps: si vous utilisez un formulaire Get, vous pouvez facilement modifier tous les POST avec GET et cela fonctionne aussi.
la source
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 empêcher l'insertion de données d'actualisation, effectuez une redirection de page vers la même page ou une page différente après l'insertion de l'enregistrement.
header ('Location:'. $ _ SERVER ['PHP_SELF']);
la source
unset
appel est-il nécessaire? Que se passerait-il si vous l'ignoriez?L'utilisation du modèle Post / Redirection / Get de Keverw est une bonne idée. Cependant, vous ne parvenez pas à rester sur votre page (et je pense que c'est ce que vous demandiez?) De plus, cela peut parfois échouer :
Une autre option serait de stocker dans une session si le texte doit être écrit dans votre base de données SQL comme ceci:
la source
Comme d'autres l'ont dit, il n'est pas possible de ne plus utiliser post / redirect / get. Mais en même temps, il est assez facile de faire ce que vous voulez faire côté serveur.
Dans votre page POST, vous validez simplement l'entrée utilisateur mais n'agissez pas dessus, vous la copiez dans un tableau SESSION. Vous redirigez ensuite vers la page de soumission principale à nouveau. Votre page de soumission principale commence par vérifier si le tableau SESSION que vous utilisez existe, et si c'est le cas, copiez-le dans un tableau local et désactivez-le. À partir de là, vous pouvez agir en conséquence.
De cette façon, vous ne faites tout votre travail principal qu'une seule fois, réalisant ce que vous voulez faire.
la source
J'ai cherché une solution pour empêcher une nouvelle soumission dans un énorme projet par la suite. Le code fonctionne très bien avec $ _GET et $ _POST et je ne peux pas changer le comportement des éléments de formulaire sans risque de bogues imprévus. Alors, voici mon code:
Cela fonctionne uniquement pour éviter la nouvelle soumission de $ _POST, pas de $ _GET. Mais c'est le comportement dont j'ai besoin. Le problème de nouvelle soumission ne fonctionne pas avec les téléchargements de fichiers!
la source
Ce qui fonctionne pour moi est:
Et dans votre forme
la source
Cet
form.php
exemple montre comment utiliser PRG correctement (lorsque le formulaire est valide ou non).la source
la source
$everything_fine
vient-elle?Pourquoi ne pas simplement utiliser la
$_POST['submit']
variable comme une instruction logique afin de sauvegarder tout ce qui se trouve dans le formulaire. Vous pouvez toujours rediriger vers la même page (au cas où ils s'actualiseraient et lorsqu'ils frapperaientgo back
au navigateur, la variable d'envoi de message ne serait plus définie. Assurez-vous simplement que votre bouton d'envoi a unname
etid
desubmit
.la source