Maison  >  Article  >  développement back-end  >  Méthode ThinkPHP pour empêcher la soumission répétée d'un formulaire, exemple d'analyse, exemple php

Méthode ThinkPHP pour empêcher la soumission répétée d'un formulaire, exemple d'analyse, exemple php

jacklove
jackloveoriginal
2018-06-25 17:54:531636parcourir

Cet article présente principalement la méthode de ThinkPHP pour empêcher la soumission répétée de formulaires. Il analyse diverses techniques de fonctionnement courantes et les précautions associées de thinkPHP pour empêcher la soumission répétée de formulaires sous forme d'exemples. Les amis dans le besoin peuvent s'y référer

<.> Cet article résume et analyse la méthode de ThinkPHP pour empêcher les soumissions répétées de formulaires à travers des exemples. 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 retour du navigateur, puis soumettre ou actualiser la page entraînera l'affichage du formulaire. 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.

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, l'adresse de votre page est

http://yourdomain.com/User/Index/login

Puis le formulaire. l'adresse d'action de la page peut être une autre adresse de traitement, telle que

780f4b3c36ad706762deaa6d9e27b237

De cette façon, une erreur revient, ou l'utilisateur clique sur le bouton de retour, ou le Retour à 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(&#39;User/Index/check_login&#39;)}" method="post">
  <input type="text" name="username" value="" id="username" />
  <input type="password" name="userpwd" id="userpwd" />
  <input type="submit" name="login_btn" id="login_btn" value="登陆"/>
</form>

JS :

$().ready(function(){
   $("#login_btn").on(&#39;click&#39;,function(){
      $(this).attr(&#39;disabled&#39;,true);
   });
});

Après la combinaison de la méthode 1 + méthode 2, en gros, plus de 90 % des problèmes de soumission répétés peuvent être résolus, mais Da Liu veut toujours parler de la troisième méthode, qui consiste à résoudre ce problème une fois et pour tous côté serveur

Méthode 3 : Utilisez la méthode de masquage des valeurs TOKEN aléatoires pour déterminer les soumissions répétées

Tout d'abord, ajoutez la méthode suivante au function.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(&#39;TOKEN&#39;, authcode($code));
}
//判断TOKEN
function checkToken($token) {
  if ($token == session(&#39;TOKEN&#39;)) {
    session(&#39;TOKEN&#39;, 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 de la page de formulaire

HTML :

568115841160b81a8386efa13ad3ccf5

Appelez la méthode

pour générer un jeton avant l'affichage de la page, et utilisez creatToken() dans la requête POST du contrôleur correspondant pour déterminer s'il faut soumettre à nouveau checkToken()

if(IS_POST)
{
$post_token = I(&#39;post.TOKEN&#39;);
 if(!checkToken($post_token)){
   $this->error(&#39;请不要重复提交页面&#39;,U(&#39;User/Index/login&#39;));
 }
}

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. a dit que vous pouvez utiliser le mécanisme Token Ring de ThinkPHP, qui est en fait plus simple. TP générera par défaut un champ caché dans le formulaire. À ce moment-là, il sera possible de juger si le champ caché existe et s'il correspond à la valeur de la session. 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.

Articles qui pourraient vous intéresser :

Analyse des méthodes d'affichage de la pagination PHP [avec astuces php de pagination générale PHP

Exemple de méthode PHP pour compresser la taille de l'image et la convertir au format jpg_php astuces

Exemple de méthode PHP pour utiliser la couche d'abstraction PDO pour obtenir les résultats de la requête Astuces php











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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn