Ich habe ein einfaches Formular, das Text an meine SQL-Tabelle sendet. Das Problem ist, dass der Benutzer nach dem Absenden des Textes die Seite aktualisieren kann und die Daten erneut gesendet werden, ohne das Formular erneut auszufüllen. Ich könnte den Benutzer auf eine andere Seite umleiten, nachdem der Text gesendet wurde, aber ich möchte, dass Benutzer auf derselben Seite bleiben.
Ich erinnere mich, dass ich etwas darüber gelesen habe, jedem Benutzer eine eindeutige Sitzungs-ID zu geben und sie mit einem anderen Wert zu vergleichen, der das Problem gelöst hat, aber ich habe vergessen, wo es ist.
POST
AnfragePOST
Daten erstellt wird. In diesem Fall müssen SieSELECT
es aus der DB. Wenn Sie beispielsweise die Rechnung erstellen, werden Sie weitergeleitet, auf/invoices/53
der die gesamte Rechnung angezeigt wird, anstatt nur "Erfolg"Antworten:
Verwenden Sie das Post / Redirect / Get-Muster. http://en.wikipedia.org/wiki/Post/Redirect/Get
Auf meiner Website speichere ich eine Nachricht in einem Cookie oder einer Sitzung, leite sie nach dem Beitrag um, lese das Cookie / die Sitzung und lösche dann den Wert dieser Sitzung oder Cookie-Variablen.
quelle
Ich möchte auch darauf hinweisen, dass Sie einen Javascript-Ansatz verwenden können
window.history.replaceState
, um ein erneutes Senden bei Aktualisierung und Zurück zu verhindern.Proof of Concept hier: https://dtbaker.net/files/prevent-post-resubmit.php
Ich würde immer noch einen Post / Redirect / Get-Ansatz empfehlen, aber dies ist eine neuartige JS-Lösung.
quelle
Sie sollten wirklich ein Post Redirect Get-Muster verwenden, um dies zu handhaben. Wenn Sie jedoch in einer Position gelandet sind, in der PRG nicht realisierbar ist (z. B. befindet sich das Formular selbst in einem Include, um Weiterleitungen zu verhindern), können Sie einige der Anforderungsparameter hashen um eine Zeichenfolge basierend auf dem Inhalt zu erstellen und dann zu überprüfen, ob Sie sie noch nicht gesendet haben.
quelle
session_start();
am Anfang der Datei gestartet haben . w3schools.com/php/php_sessions.asp sagt Hinweis: Die Funktion session_start () muss das allererste in Ihrem Dokument sein. Vor HTML-Tags.Ich verwende diese Javascript-Zeile, um das Popup zu blockieren und nach der erneuten Übermittlung des Formulars beim Aktualisieren zu fragen, sobald das Formular gesendet wurde.
Platzieren Sie diese Zeile einfach in der Fußzeile Ihrer Datei und sehen Sie die Magie
quelle
Sie können die erneute Übermittlung von Formularen über eine Sitzungsvariable verhindern.
Zuerst müssen Sie
rand()
in einem Textfeld und$_SESSION['rand']
auf der Formularseite Folgendes festlegen :Überprüfen Sie danach
$_SESSION['rand']
mit einem Textfeldwert$_POST['randcheck']
wie folgt :quelle
<input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />
stattdessen verwenden$_POST
den Formulardaten dieselbe Seite neu geladen wird, um die Sitzungs- und Post-Variablen zurückzusetzen. Die Erstellung von Variablen sollte auch erfolgen, nachdem überprüft wurde, ob die Variablen übereinstimmen. Daherunset
wird nicht benötigt.Wenn das Formular verarbeitet wird, leiten Sie auf eine andere Seite weiter:
Sie können auch auf dieselbe Seite umleiten.
Wenn Sie so etwas wie Kommentare ausführen und möchten, dass der Benutzer auf derselben Seite bleibt, können Sie Ajax verwenden, um die Formularübermittlung durchzuführen
quelle
Verwenden Sie die Kopfzeile und leiten Sie die Seite um.
header("Location:your_page.php");
Sie können auf dieselbe oder eine andere Seite umleiten.Deaktivieren Sie $ _POST, nachdem Sie es in die Datenbank eingefügt haben.
unset($_POST);
quelle
unset
? Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen könnenIch habe die nächste Problemumgehung gefunden. Sie können die Umleitung nach der Verarbeitung der
POST
Anforderung durch Bearbeiten deshistory
Objekts umgehen.Sie haben also das HTML-Formular:
Wenn Sie dieses Formular auf Ihrem Server verarbeiten, leiten Sie den Benutzer nicht weiter,
/the/result/page
indem Sie denLocation
Header wie folgt einrichten:Nach der Verarbeitung der
POST
Daten rendern Sie klein<script>
und das Ergebnis/the/result/page
Das
<script>
solltest du rendern:Das Ergebnis ist:
Wie Sie sehen können, werden die Formulardaten
POST
in einprocess.php
Skript umgewandelt.Dieses Skript verarbeitet
POST
Daten und rendert/the/result/page
sofort mit:POST
Daten beim Aktualisieren der Seite (F5)POST
wenn Sie durch den Browserverlauf zur vorherigen / nächsten Seite navigierenUPD
Als eine andere Lösung bitte ich Feature - Anfrage die Mozilla FireFox Team Benutzer einrichten , damit
NextPage
Header, wie funktioniertLocation
Header und Makepost/redirect/get
veraltet Muster.Zusamenfassend. Wenn der Server Formulardaten
POST
erfolgreich verarbeitet, gilt Folgendes:NextPage
Header anstelle vonLocation
POST
Rendern Sie das Ergebnis der Verarbeitung von Formulardaten so, wie es für dieGET
Anforderung impost/redirect/get
Muster gerendert würdeDer Browser wiederum, wenn der
NextPage
Header angezeigt wird :window.location
MitNextPage
Wert einstellenGET
Anfrage aus,NextPage
anstattPOST
Daten neu zu formulierenIch denke, das wäre exzellent, wenn es implementiert würde, nicht wahr?
=)
quelle
Ein ziemlich todsicherer Weg besteht darin, eine eindeutige ID in den Beitrag zu implementieren und im Cache zwischenzuspeichern
Dann machen Sie in Ihrem Code Folgendes:
quelle
Diese Methode funktioniert bei mir gut und ich denke, dies ist die einfachste, um diesen Job zu erledigen.
Die allgemeine Idee besteht darin, den Benutzer nach dem Senden des Formulars auf einige andere Seiten umzuleiten, wodurch die erneute Übermittlung des Formulars bei der Seitenaktualisierung gestoppt wird. Wenn Sie den Benutzer nach dem Absenden des Formulars auf derselben Seite halten müssen, können Sie dies auf verschiedene Arten tun. Hier beschreibe ich jedoch die Javascript-Methode.
Javascript-Methode
Diese Methode ist recht einfach und blockiert das Popup-Fenster, in dem beim erneuten Senden des Formulars nach erneuter Übermittlung des Formulars gefragt wird. Platzieren Sie einfach diese Zeile Javascript-Code in der Fußzeile Ihrer Datei und sehen Sie die Magie.
quelle
Javascript
Diese Methode ist recht einfach und blockiert das Popup-Fenster, in dem beim erneuten Senden des Formulars nach erneuter Übermittlung des Formulars gefragt wird. Platzieren Sie einfach diese Zeile Javascript-Code in der Fußzeile Ihrer Datei und sehen Sie die Magie.
quelle
Leiten Sie es einfach auf dieselbe Seite um, nachdem Sie Formulardaten verwendet haben, und es funktioniert. Ich habe es versucht.
quelle
Eine verfeinerte Version von Moobs Beitrag. Erstellen Sie einen Hash des POST, speichern Sie ihn als Sitzungscookie und vergleichen Sie die Hashes jeder Sitzung.
quelle
Grundsätzlich müssen Sie von dieser Seite umleiten, aber es kann immer noch ein Problem verursachen, während Ihr Internet langsam ist (Header von der Serverseite umleiten).
Beispiel eines Basisszenarios:
Klicken Sie zweimal auf die Schaltfläche "Senden"
Weg zu lösen
Client-Seite
Serverseite
quelle
So verhindern Sie die erneute Übermittlung von PHP-Formularen ohne Weiterleitung. Wenn Sie $ _SESSION (nach session_start) und ein $ _POST-Formular verwenden, können Sie Folgendes tun:
Geben Sie in Ihr HTML-Formular Folgendes ein:
Jedes Mal, wenn das Formular gesendet wird, wird ein neuer Akt generiert, in der Sitzung gespeichert und mit dem Post-Akt verglichen.
Ps: Wenn Sie ein Get-Formular verwenden, können Sie alle POSTs einfach mit GET ändern und es funktioniert auch.
quelle
Rufen Sie nach dem Einfügen in die Datenbank die Methode unset () auf, um die Daten zu löschen.
nicht gesetzt ($ _ POST);
Führen Sie nach dem Einfügen des Datensatzes eine Seitenumleitung auf dieselbe Seite oder eine andere Seite durch, um das Einfügen von Aktualisierungsdaten zu verhindern.
Header ('Location:'. $ _ SERVER ['PHP_SELF']);
quelle
unset
Anruf benötigt? Was würde passieren, wenn Sie es überspringen würden?Es ist eine gute Idee, das Post / Redirect / Get-Muster von Keverw zu verwenden. Sie können jedoch nicht auf Ihrer Seite bleiben (und ich denke, das war es, wonach Sie gefragt haben?). Außerdem kann es manchmal fehlschlagen :
Eine andere Möglichkeit wäre, in einer Sitzung zu speichern, wenn Text wie folgt in Ihre SQL-Datenbank geschrieben werden soll:
quelle
Wie andere gesagt haben, ist es nicht möglich, post / redirect / get nicht mehr zu verwenden. Gleichzeitig ist es jedoch recht einfach, das zu tun, was Sie serverseitig tun möchten.
Auf Ihrer POST-Seite validieren Sie einfach die Benutzereingaben, reagieren jedoch nicht darauf, sondern kopieren sie in ein SESSION-Array. Anschließend leiten Sie wieder zur Hauptübermittlungsseite zurück. Ihre Hauptübermittlungsseite beginnt mit der Überprüfung, ob das von Ihnen verwendete SESSION-Array vorhanden ist. Wenn ja, kopieren Sie es in ein lokales Array und deaktivieren Sie es. Von dort aus können Sie darauf reagieren.
Auf diese Weise erledigen Sie Ihre Hauptarbeit nur einmal und erreichen das, was Sie tun möchten.
quelle
Ich suchte nach einer Lösung, um eine erneute Einreichung in einem großen Projekt zu verhindern. Der Code funktioniert sehr gut mit $ _GET und $ _POST, und ich kann das Verhalten von Formularelementen nicht ändern, ohne das Risiko unvorhergesehener Fehler. Also, hier ist mein Code:
Es funktioniert nur, um die erneute Übermittlung von $ _POST zu vermeiden, nicht von $ _GET. Aber das ist das Verhalten, das ich brauche. Das Problem der erneuten Übermittlung funktioniert nicht beim Hochladen von Dateien!
quelle
Was für mich funktioniert ist:
Und in deiner Form
quelle
quelle
$everything_fine
sie?Warum nicht einfach die
$_POST['submit']
Variable als logische Anweisung verwenden, um alles im Formular zu speichern? Sie können jederzeit auf dieselbe Seite umleiten (Falls sie aktualisiert werden und wenn siego back
im Browser angezeigt werden, wird die Variable "Beitrag senden" nicht mehr festgelegt. Stellen Sie einfach sicher, dass Ihre Schaltfläche "Senden" einname
undid
von enthältsubmit
.quelle