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
https://www.php.cn/
lautet, kann die Formularaktionsadresse der Seite eine andere Verarbeitungsadresse sein, z. B.
<form action="{:U('User/Index/check_login')}" method="post">
, 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('User/Index/check_login')}" method="post">
JS:
$().ready(function(){ $("#login_btn").on('click',function(){ $(this).attr('disabled',true); }); });
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('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); }
im Formular Seitenformular Füllen Sie den folgenden HTML-Code aus
HTML:
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />
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('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要重复提交页面',U('User/Index/login')); } }
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!