Heim > Backend-Entwicklung > PHP-Tutorial > Analysieren Sie Beispiele für die Methoden von ThinkPHP zur Verhinderung doppelter Übermittlungen von Formularen

Analysieren Sie Beispiele für die Methoden von ThinkPHP zur Verhinderung doppelter Übermittlungen von Formularen

coldplay.xixi
Freigeben: 2023-04-09 13:52:02
nach vorne
2854 Leute haben es durchsucht

Analysieren Sie Beispiele für die Methoden von ThinkPHP zur Verhinderung doppelter Übermittlungen von Formularen

Dieser Artikel fasst die Methode von ThinkPHP zur Verhinderung der wiederholten Einreichung von Formularen zusammen und analysiert sie. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Warum gibt es eine Gefahr doppelter Formulare?

Wenn während der Entwicklung ein neues oder geändertes Formular hinzugefügt oder geändert wird, erfolgt dies nach dem Datenbankvorgang Wenn es im Hintergrund ausgeführt wird, stellen wir es so ein, dass es nicht springt. Gehen Sie zu anderen Seiten oder kehren Sie zu dieser Seite zurück. Wenn Sie vor dem Absenden oder Aktualisieren der Seite auf die Zurück-Schaltfläche des Browsers klicken, wird das Formular wiederholt gesendet, dh dieser Datensatz wird hinzugefügt oder zweimal geändert.

Der Grund, warum das Formular wiederholt gesendet wird, besteht darin, dass das zum ersten Mal gesendete Formular im Speicher zwischengespeichert wird und erst verschwindet, wenn die Seite das nächste Mal gesendet oder die Seite geschlossen oder auf andere Seiten umgeleitet wird. Wenn der Selbstaufruf zurückkehrt, sind die Daten im Speicher noch vorhanden. Zu diesem Zeitpunkt kann der übermittelte Code auf der Seite den übermittelten Wert noch erkennen, was den Effekt einer wiederholten Übermittlung verursacht.

Verwandte Lernempfehlungen: php-Programmierung (Video)

Wie löst man das Problem?

Um die Online-Lösungen und eigenen Tests zusammenzufassen, können Sie folgende Methoden nutzen:

Methode 1: Die einfachste: Gehen Sie nach dem Absenden der Seite beispielsweise auf eine andere Seite statt auf diese Seite , Sie Wenn die Seitenadresse

//m.sbmmt.com/

lautet, kann die Formularaktionsadresse der Seite eine andere Verarbeitungsadresse sein, z. B.

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
Nach dem Login kopieren

, die einen Fehler meldet und zurückgibt, oder die Der Benutzer klickt auf die Schaltfläche „Zurück“ und kehrt dennoch zur vorherigen Adresse zurück, diese Situation ist jedoch nicht sicher. Es ist auch notwendig, Methode 2 abzugleichen, um gemeinsam sicherer zu sein

Methode 2: Nach dem Absenden des Formulars wird die Schaltfläche „Senden“ grau/versteckt die Schaltfläche „Senden“

Diese Methode wird im Allgemeinen in Kombination mit Methode 1 durchgeführt und verwendet JS Um die Klickaktionen des Benutzers dynamisch zu überwachen, setzen Sie das Schaltflächenattribut dynamisch auf „disabled“, also grau und nicht verfügbar. Der Code lautet wie folgt:

HTML:

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
  
  
  
Nach dem Login kopieren

JS:

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

Nach der Kombination von Methode 1 + Methode 2 können im Grunde mehr als 90 % der wiederholten Einreichungsprobleme gelöst werden, aber Da Liu möchte immer noch über die dritte Methode sprechen , das ist Lösen Sie dieses Problem ein für alle Mal auf der Serverseite

Methode 3:Verwenden Sie die Methode zum Ausblenden zufälliger TOKENWerte, um wiederholte Übermittlungen zu beurteilen

Fügen Sie zunächst die folgende Methode zu den Funktionen des Projekts hinzu. php

//创建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);
}
Nach dem Login kopieren

im Formular Seitenformular Füllen Sie den folgenden HTML-Code aus

HTML:

<input type="hidden" name="TOKEN" value="{:session(&#39;TOKEN&#39;)}" />
Nach dem Login kopieren

Rufen Sie creatToken()方法生成token,在相应控制器POST请求中 使用 checkToken() an, bevor die Seite angezeigt wird, um zu bestimmen, ob eine erneute Übermittlung erfolgen soll

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

Grundsätzlich werden diese drei Methoden zusammen verwendet, um das Problem zu lösen Wiederholte Formularübermittlung in der ThinkPHP-Entwicklung. Einige Studenten sagten natürlich, dass Sie den Token-Ring-Mechanismus von ThinkPHP verwenden können, der tatsächlich einfacher ist. TP generiert dann standardmäßig ein ausgeblendetes Feld es entspricht dem Wert in der Sitzung. Das Prinzip ist das gleiche wie bei Methode 3.

PS:Heute habe ich den Inhalt endlich mit dem Markdown-Editor von Jianshu gepostet. Tatsächlich wurde die Markdown-Syntax nicht abgedeckt und das gesamte Layout war erfrischend, nicht schlecht.

Verwandte Lernempfehlungen: Programmiervideos

Das obige ist der detaillierte Inhalt vonAnalysieren Sie Beispiele für die Methoden von ThinkPHP zur Verhinderung doppelter Übermittlungen von Formularen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:jb51.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage