Merfachabsenden eines Formulars unterbinden - wie macht ihr das?
Krasser
- sonstiges
tach
Wie verhindert ihr das mehrfachabsenden eines Formulars?
Ich hab bisher immer ein Cookie gesetzt und dann geschaut obs funktioniert.
Aber wenn zum Beispiel jemand im Admin Menü mehrere Einträge hintereinander löschen will, und ein Cookie gesetzt ist, kann er nur einen Eintrag löschen, danach ja nicht mehr. Wenn ich das Cookie zeitlich berenze auf 20 sek. Muss er entweder immer warten oder er hat das Problem immernoch, wenn er mal kurz auf Toilette war.
Wie verhindert ihr das?
Gibts da keine Möglichkeit nen PHP-Header zu setzen o.ä.?
Oder mit Javascript das ganz zu unterbinden - was ich eher doof fände des damit zu machen.
grüße, der Krasse
Hello,
Wie verhindert ihr das mehrfachabsenden eines Formulars?
Das geht nur mit einer clientseitigen Sprache, also z.B. mit JavaScript
Die mehrfache Weiterverarbeitung auf dem Server kann aber verhindert werden, wenn Du dem Formular einen Unique Key gibst, z.B. als Hidden-Element.
Dann kannst Du nach der Datenübernahme in Deiner Datenbank nachschauen lassen, ob der der Key schon vohanden ist. Ist er da, kannst Du dir die Weiterverarbeitung des Requests zum größten teil sparen. Der User sollte natürlich noch eine Nachricht mit dem nächsten möglichen Schritt als Link oder Button bekommen.
Oder aber, Du legst es einfach darauf an. Wenn in der Tabelle ein Unique Contraint auf die Spalte gesetzt ist, wird der Eintrag ja ohnehin abgelehnt. Den benötigst Du ja sowieso (auch wenn Du vorher abfragst), damit Du Dir kein TOCTOU-Problem baust. (Race Condition zwischen nebenläufigen Prozessen).
http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Für die Unique-ID eigent sich z.B. beim Apache Webserver $_SERVER['UNIQUE_ID']. Das ist aber nur vorhanden, wenn das passende Modul auch geladen ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Man wird beim aktualisieren ja gefragt "Neu senden"?..
Ich möchte das diese Abfrage nicht mehr erscheint.
Ich möchte dann F5 oder strg+R drücken können und die Seite wird ganz normal aktualsiert.
ist das irgendwie möglich?
Wenn mit JS - wie?
Hi,
Man wird beim aktualisieren ja gefragt "Neu senden"?..
Ja - und zwar genau dann, wenn die aktuelle Ressource per POST angefordert wurde.
Ich möchte das diese Abfrage nicht mehr erscheint.
Ich möchte dann F5 oder strg+R drücken können und die Seite wird ganz normal aktualsiert.
Dann sorge dafür, dass die aktuell angezeigte Ressource *nicht* per POST angefordert wurde.
ist das irgendwie möglich?
Bspw. per serverseitiger Weiterleitung nach dem POST, so dass der Browser eine neue Ressource wieder per GET anfordert.
Das Thema ist nicht neu, Archivsuche weiss mehr.
MfG ChrisB
Hello,
Man wird beim aktualisieren ja gefragt "Neu senden"?..
Das hast Du eben aber so nicht gesagt.
Es handelt sich hier auch um mehrere Dinge, die Du beachten musst.
1. Abfangen eines Mehrfachposts, der bei manchen Browsern möglich ist,
solange noch kein Response eingetroffen ist
(wie das serverseitig geht, habe ich beschrieben)
2. Rücksetzen der Seite, damit sie die gespeicherten Postdaten verwirft
und auch bei History-Back nicht nochmal sendet.
Dafür ist der Statuscode 205 da
Der hat nur den Nachteil, dass Du kein response-Body mitsenden kannst
Den musst Du Dir dann über einen Location Header extra anfordern.
Dazu benötigt man schon fast wieder eine Session. Man will dem User
schließlich die eingetragenen Daten nochmals vorlegen
3. Damit der Request auch bei einem Multipost vollständig abgearbeitet
wird und keine halben Sachen in Datenbanken oder Datein eingetragen
werden, muss man den User-Abort während der Formularverarbeitung auf
dem Server abschalten.
http://de3.php.net/manual/en/function.ignore-user-abort.php
Sollte nämlich der Folgerequest noch während des bereits laufenden
ausgelöst werden, könnte die Barbeitung des bereits laufenden einfach
mittendrin abgebrochen werden. Müssen nun aufwändige von einander abhängige
Datenmanipulationen durchgeführt werden, könnten die damit inkonsistent werden.
Außerdem kannst Du noch auf dem Client mittels JavaScript den Submit-Button abschlaten, wenn er einmal gedrückt wurde.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg