Cet article résume et analyse la méthode de ThinkPHP pour empêcher la soumission répétée de formulaires. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
Pourquoi y a-t-il des formulaires en double ?
Pendant le développement, si un nouveau ou Pour le formulaire modifié, après avoir terminé l'opération de base de données en arrière-plan, nous définissons s'il faut accéder à d'autres pages ou revenir à cette page. À ce stade, cliquer sur le bouton Précédent du navigateur avant de soumettre ou d'actualiser la page entraînera l'affichage du formulaire. être soumis à plusieurs reprises, c'est-à-dire que cet enregistrement sera ajouté ou modifié deux fois.
La raison pour laquelle le formulaire est soumis à plusieurs reprises est que le formulaire soumis pour la première fois sera mis en cache dans la mémoire et ne disparaîtra que la prochaine fois que la page sera soumise ou que la page sera fermée ou redirigée vers d'autres pages. Lorsque l'auto-appel revient, les données en mémoire sont toujours là. À ce moment, le code soumis dans la page peut toujours détecter la valeur soumise, ce qui entraînera l'effet d'une soumission répétée.
Recommandations d'apprentissage associées : programmation php (vidéo)
Comment le résoudre ?
Pour résumer les solutions en ligne et vos propres tests, vous pouvez utiliser les méthodes suivantes :
Méthode 1 : La plus simple : après avoir soumis la page Accédez à une autre page au lieu de cette page. Par exemple, si l'adresse de votre page est
//m.sbmmt.com/
, alors l'adresse d'action de formulaire de la page peut être Pour une autre adresse de traitement, telle que
<form action="{:U('User/Index/check_login')}" method="post">
, une erreur est signalée et renvoyée, ou l'utilisateur clique sur le bouton de retour et reviendra toujours à l'adresse précédente, mais cette situation n'est pas sûre. Il est également nécessaire de faire correspondre la méthode 2 pour être plus en sécurité ensemble
Méthode 2 : Après avoir soumis le formulaire, le bouton de soumission devient gris/masquer le bouton de soumission
Cette méthode est généralement combiné avec la méthode 1. Ce que vous faites est d'utiliser JS pour surveiller dynamiquement l'action de clic de l'utilisateur et de définir dynamiquement l'attribut du bouton sur désactivé, ce qui signifie qu'il est gris et indisponible. Le code est le suivant :
HTML:
<form action="{:U('User/Index/check_login')}" method="post">
JS:
$().ready(function(){ $("#login_btn").on('click',function(){ $(this).attr('disabled',true); }); });
Une fois la méthode 1 + la méthode 2 combinées, en gros, plus de 90 % des problèmes de soumission en double peuvent être résolu, mais la plupart d'entre eux Liu veut encore parler ici de la troisième méthode, qui consiste à résoudre ce problème une fois pour toutes côté serveur
Méthode 3 : Utilisez la méthode de masquer des valeurs TOKEN aléatoires à répéter Soumettre le jugement
Tout d'abord, ajoutez la méthode suivante dans les fonctions.php du projet
//创建TOKEN function createToken() { $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)); session('TOKEN', authcode($code)); } //判断TOKEN function checkToken($token) { if ($token == session('TOKEN')) { session('TOKEN', NULL); return TRUE; } else { return FALSE; } } /* 加密TOKEN */ function authcode($str) { $key = "YOURKEY"; $str = substr(md5($str), 8, 10); return md5($key . $str); }
Remplissez le code HTML suivant dans le formulaire formulaire de page
HTML :
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />
Appelez la méthode creatToken()
pour générer un jeton avant l'affichage de la page et utilisez checkToken()
dans la requête POST du contrôleur correspondante pour déterminer s'il faut soumettre à nouveau
if(IS_POST) { $post_token = I('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要重复提交页面',U('User/Index/login')); } }
Fondamentalement, ces trois méthodes peuvent être utilisées ensemble.Pour résoudre le problème de la soumission répétée de formulaires dans le développement ThinkPHP, bien sûr, certains étudiants ont dit que vous pouvez utiliser le mécanisme d'anneau à jetons de ThinkPHP, qui est en fait plus simple à générer. un champ caché dans le formulaire par défaut, puis déterminez si ce champ caché existe et cela dépend simplement si la valeur dans la session est celle que vous souhaitez. Le principe est le même que la méthode 3.
PS :Aujourd'hui, j'ai finalement publié le contenu à l'aide de l'éditeur de démarques de Jianshu. Effectivement, la syntaxe de démarque n'était pas couverte et la mise en page entière était rafraîchissante, pas mal.
Recommandations d'apprentissage associées : Vidéos de programmation
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!