Discussion:
Formular mehrmals abschicken verhindern
(zu alt für eine Antwort)
Peter Stoss
2004-11-03 06:25:26 UTC
Permalink
Hallo,
ich habe ein Formular, was über mehrere Seiten geht (da mit einer
Auswahl erst eine Datenbank-Abfrage passiert, die dann wieder zur
Auswahl steht....) Also quasi STEP1 - STEP2 usw. Auf der letzten Seite
werden die Daten entgültig in eine Datenbank geschrieben.
Leider kommt es öfter mal vor, dass ein Benutzer seine
Browser-zurück-Taste benutzt, und das Formular doppelt abgeschickt
wird.
Wie kann ich das verhindern? Ein Formular darf praktisch nur dann
abgeschickt werden, wenn der Vorgang ganz von vorne begonnen hat, und
bis zum Ende durchgeführt wurde.

Hat jemand ein Beispiel für mich?

Danke!

Peter.
Stephan Mann
2004-11-03 06:46:46 UTC
Permalink
Post by Peter Stoss
Hat jemand ein Beispiel für mich?
Bitte FAQ bookmarken!

11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.php-faq.de/q/q-formular-mehrfach.html

hth, stephan
--
Der Terrorismus ist ein Krieg der Armen gegen die Reichen.
Der Krieg ist ein Terrorismus der Reichen gegen die Armen.
[Sir Peter Ustinov, 1921 - 2004]
Ron Kroeger
2004-11-09 16:15:07 UTC
Permalink
Post by Stephan Mann
Bitte FAQ bookmarken!
11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.php-faq.de/q/q-formular-mehrfach.html
Das ist aber sehr "kompliziert" ...besonders für Profi Programmierer
wie mich ;-)

Gibt es da keinen Befehl, der die Formular-Daten zurücksetzt
nachdem sie "submittet" wurden?

Habe ein ähnliches Problem: Nach Eintrag und verschicken des
Formulars werden die Daten ordnungsgemäß in Datenbank übertragen.
Nach einem Reload der Seite aber leider nochmal und nochmal und
nochmal........

Gruß Ron
--
Die Kunst des Lernens:
Je schneller man liest, desto weniger versteht man.
Je weniger man versteht, desto weniger behält man.
Je weniger man behält, desto weniger vergisst man.
Je weniger man vergisst, desto mehr weiß man.
(Anonym)
Rainer Huebenthal
2004-11-09 16:38:47 UTC
Permalink
Post by Ron Kroeger
Post by Stephan Mann
Bitte FAQ bookmarken!
11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.php-faq.de/q/q-formular-mehrfach.html
Das ist aber sehr "kompliziert" ...besonders für Profi Programmierer
wie mich ;-)
Gibt es da keinen Befehl, der die Formular-Daten zurücksetzt
nachdem sie "submittet" wurden?
Habe ein ähnliches Problem: Nach Eintrag und verschicken des
Formulars werden die Daten ordnungsgemäß in Datenbank übertragen.
Nach einem Reload der Seite aber leider nochmal und nochmal und
nochmal........
Wenn es darum geht, Bedienfehler durch (versehentliches)
drücken des Submitknopfes zu elminieren, so kann man dies in
den hiddenfeldern vermerken, das dieser Satz bereits
verabreitet wurden. Dazu kann man saemtliche Attribute
wiederholen, oder einen MD5 Hash mitgeben oder auch andere
Sachen. Gegen willkuerliches oder vorsaetzliches senden des
Formualrs schützt sowas nicht wirklich.

Denkbar waere auch, bei umfangreichen Daten in einem
Hiddenfeld des Formulars einen auto_increment Wert
mitzuliefern. Findet man unter dieser ID dann dieselben Werte
wie im Formular, dann hat man die schon verarbeitet.

Das Problem ist nur folgendes:

Ich bestelle bei dir etwas durch druecken eines Submitknopfes.
Du erzeugst in der Tabelle der zu liefernden Posten ArtikelID
und Anzahl. Jetzt will ich aber den selben Artikel nocmal
bestellen. Jetzt muss man ueberlegen, wie man verfahren will:
Den Kunden auffordern, die Anzahl zu ändern, oder
stllschweigend die Anzahl zu erhoehen und zu praesentieren.

Ich tendiere dazu, die Anzahl zu erhoehen, dem Kunden dies
darzulegen und ihn um Bestätigung bitten.

Ohne konkreten Anwendungsfall kann ich aber nicht mehr sagen.

cu
Rainer
--
http://www.reisetraeume.com
Ron Kroeger
2004-11-09 20:44:23 UTC
Permalink
Post by Rainer Huebenthal
Wenn es darum geht, Bedienfehler durch (versehentliches)
drücken des Submitknopfes zu elminieren, so kann man dies in
den hiddenfeldern vermerken, das dieser Satz bereits
verabreitet wurden. Dazu kann man saemtliche Attribute
wiederholen, oder einen MD5 Hash mitgeben oder auch andere
Sachen. Gegen willkuerliches oder vorsaetzliches senden des
Formualrs schützt sowas nicht wirklich.
Denkbar waere auch, bei umfangreichen Daten in einem
Hiddenfeld des Formulars einen auto_increment Wert
mitzuliefern. Findet man unter dieser ID dann dieselben Werte
wie im Formular, dann hat man die schon verarbeitet.
.
.
.
Ohne konkreten Anwendungsfall kann ich aber nicht mehr sagen.
cu
Rainer
Hallo Rainer,

zunächst erst mal vielen Dank für die umfangreiche Antwort.

Eigentlich will ich nur in einer HTML-Seite mit 2 Frames im 1.Frame
mittels Formular Daten eingeben, in die Datenbanktabelle
eintragen(was ja auch funzt-HURRA!) und diese dann im 2. Frame
aufzählen. Aber anhand Deiner Ausführungen und der Beschreibung
unter http://www.php-faq.de/q/q-formular-mehrfach.html muss ich zur
bitteren Erkenntnis kommen, dass es keinen Befehl
"lösche_alle_formular_daten_bevor_die_seite_neu_geladen_wird_damit_nicht_immer_der_gleiche_mist_in_der_datenbank_landet"
gibt.
Also muss ich noch ein bißchen (HTML und PHP) "üben", um die Lösung
auf php-faq.de und Deine Ausführungen zu verstehen.
Vielen Dank nochmal
Ron
--
Die Kunst des Lernens:
Je schneller man liest, desto weniger versteht man.
Je weniger man versteht, desto weniger behält man.
Je weniger man behält, desto weniger vergisst man.
Je weniger man vergisst, desto mehr weiß man.
(Anonym)
Ron Kroeger
2004-11-12 10:13:00 UTC
Permalink
Post by Ron Kroeger
Gibt es da keinen Befehl, der die Formular-Daten zurücksetzt
nachdem sie "submittet" wurden?
Habe ein ähnliches Problem: Nach Eintrag und verschicken des
Formulars werden die Daten ordnungsgemäß in Datenbank übertragen.
Nach einem Reload der Seite aber leider nochmal und nochmal und
nochmal........
Wen's interessiert:
Problem (nicht sehr elegant) gelöst durch Abfrage des Inhaltes des
zuletzt eingegebenen Datensatzes; wenn Inhalt gleich, dann Abbruch.
MfG
Ron
--
Manche leben so vorsichtig,
dass sie wie neu sterben.
Michael Richter
Daniel Jaenecke
2004-11-12 10:17:44 UTC
Permalink
Post by Ron Kroeger
Problem (nicht sehr elegant) gelöst durch Abfrage des Inhaltes des
zuletzt eingegebenen Datensatzes; wenn Inhalt gleich, dann Abbruch.
Diese Einschränkung würde nur dann Sinn machen, wenn nur genau ein Prozess
in die DB schreiben kann.

12.12. Was sind Race Conditions? Wie kann ich sie vermeiden?
http://www.php-faq.de/q/q-race-condition.html

Warum Du nicht stattdessen die Lösung aus der FAQ verwendest ist mir ein
Rätsel.

-dj-
--
Rules are there to make you think before you break them.
[T. Pratchett]
Ron Kroeger
2004-11-12 17:15:05 UTC
Permalink
On Fri, 12 Nov 2004 11:17:44 +0100 Daniel Jaenecke wrote:
Grüß Dich Daniel,
Post by Daniel Jaenecke
Diese Einschränkung würde nur dann Sinn machen, wenn nur genau ein Prozess
in die DB schreiben kann.
Ich wollte nur verhindern, dass jemand den "NEU LADEN" button (evtl.
mehrfach) anklickt und immer die gleichen Einträge in die Datenbank
getätigt werden. Wenn ein Formular seine Daten per "POST" übergeben hat,
dann sind sie immer noch vorhanden und nach einem reload der Seite
werden sie nochmal übergeben. Da ich nicht weiß, ob und wie man diese
Variablen löschen kann, habe ich halt meine begrenzten Mittel genutzt.
Post by Daniel Jaenecke
12.12. Was sind Race Conditions? Wie kann ich sie vermeiden?
http://www.php-faq.de/q/q-race-condition.html
Habe ich gelesen und glaube, dass es sich hierbei um ein anderes Problem
handelt, soweit ich dass mit meinen beschränkten PHP-Kentnissen raffe.

Rainer Huebenthal hat mir bereits eine Stelle aus den FAQ's gepostet,
die ich aber (noch) nicht umsetzen kann, da ich die Lösung nicht
kappiere.
Post by Daniel Jaenecke
Warum Du nicht stattdessen die Lösung aus der FAQ verwendest ist mir ein
Rätsel.
Vielen Dank für die Mühe
Ron
--
Manche leben so vorsichtig,
dass sie wie neu sterben.
Michael Richter
Daniel Jaenecke
2004-11-12 21:04:15 UTC
Permalink
Post by Ron Kroeger
Ich wollte nur verhindern, dass jemand den "NEU LADEN" button (evtl.
mehrfach) anklickt und immer die gleichen Einträge in die Datenbank
getätigt werden. Wenn ein Formular seine Daten per "POST" übergeben hat,
dann sind sie immer noch vorhanden und nach einem reload der Seite
werden sie nochmal übergeben. Da ich nicht weiß, ob und wie man diese
Variablen löschen kann, habe ich halt meine begrenzten Mittel genutzt.
vereinfacht:
User A schickt das Formular mit dem Wert "foo" ab -> es wird "foo" in die
DB geschrieben.
User B schickt das Formular mit dem Wert "bar" ab -> es wird "bar" in die
DB geschrieben.
Jetzt rate mal was passiert, wenn User A ein Reload macht?!
Post by Ron Kroeger
Habe ich gelesen und glaube, dass es sich hierbei um ein anderes Problem
handelt, soweit ich dass mit meinen beschränkten PHP-Kentnissen raffe.
Dann solltest Du Deine Kenntnisse schleunigst erweitern, auch um die Lösung
aus der FAQ umsetzen zu können.

Gruß
-dj-
--
Anything worth doing is worth doing for money.
[Ferengi Rules of Acquisition #012]
Peter Stoss
2004-11-22 11:52:03 UTC
Permalink
Post by Daniel Jaenecke
User A schickt das Formular mit dem Wert "foo" ab -> es wird "foo" in die
DB geschrieben.
User B schickt das Formular mit dem Wert "bar" ab -> es wird "bar" in die
DB geschrieben.
Jetzt rate mal was passiert, wenn User A ein Reload macht?!
Könnte man denn eine Session regstrieren, die sagt:
$_SESSION['benutzerid']['formular_id']=1 und eine entsprechende
Abfrage daruaf machen? Gelöscht wird sie indem man auf die
formular-startseite geht. Mal ausprobieren.

Peter.
Michael Weber
2004-11-22 14:03:40 UTC
Permalink
[22 Nov 2004 03:52:03 -0800/Peter Stoss]
Post by Peter Stoss
Post by Daniel Jaenecke
User A schickt das Formular mit dem Wert "foo" ab -> es wird "foo" in die
DB geschrieben.
User B schickt das Formular mit dem Wert "bar" ab -> es wird "bar" in die
DB geschrieben.
Jetzt rate mal was passiert, wenn User A ein Reload macht?!
$_SESSION['benutzerid']['formular_id']=1 und eine entsprechende
Abfrage daruaf machen? Gelöscht wird sie indem man auf die
formular-startseite geht. Mal ausprobieren.
Ähnliches habe ich bei einem Login-Formular, dass auf einer beliebigen Seite
eingeschoben wird. Wird ein Session-Wert per URL auf true gesetzt, wird das
Formular geladen, welches selbst den Session-Wert auf check setzt. Nur dann
werden Daten überhaupt registriert, geprüft und der Wert gelöscht. Da nach
dem Abschicken des Formulars dieses wieder verschwindet (inkl. URL-
Parameter), kann danach aktualisiert werden, solange es will. Ein falsche
Eingabe produziert so z.B. nur 1x einen Fehler.

Der User _muss_ das Formular vorher aufrufen, sonst geht dem Script das
Aktualisierte sonstwo vorbei. Ein User müsste also per Hand den URL-Parameter
setzen, wenn er z.B. stänkern will.

Für den unwahrscheinlichen Fall, dass er das tut, müsste dann noch ein Wert
her, der entscheidet, ob das Affenformular beim Aufbau leer oder mit den
letzten Eingaben gefüllt wird.

Das geht wohl auch ohne Session, aber IMO dann nur per Include-Kreisverkehr.


grüsse
michael

Markus Ernst
2004-11-12 16:34:34 UTC
Permalink
Post by Peter Stoss
Hallo,
ich habe ein Formular, was über mehrere Seiten geht (da mit einer
Auswahl erst eine Datenbank-Abfrage passiert, die dann wieder zur
Auswahl steht....) Also quasi STEP1 - STEP2 usw. Auf der letzten Seite
werden die Daten entgültig in eine Datenbank geschrieben.
Leider kommt es öfter mal vor, dass ein Benutzer seine
Browser-zurück-Taste benutzt, und das Formular doppelt abgeschickt
wird.
Wie kann ich das verhindern? Ein Formular darf praktisch nur dann
abgeschickt werden, wenn der Vorgang ganz von vorne begonnen hat, und
bis zum Ende durchgeführt wurde.
Die anderen Antworten sind richtig und wichtig, da sowas *auch noch* auf der
Serverseite gemacht werden muss. Da das Formular-Abschicken aber auf dem
Client passiert, ist es sinnvoll, die Prüfung vorher schon mal auf dem
Client zu machen, also mit Javascript. Ich würde hierfür ein Hidden Field
machen mit dem Wert 0, den beim Abschicken überprüfen und nachher auf 1
setzen. Wenn er schon auf 1 ist, statt dessen false zurückgeben und ein
Alert mit dem Text "Bitte nur einmal klicken" ausgeben.

Wenn du dazu mehr hilfe brauchst, findest du die sicher in einer
Javascript-Gruppe.

HTH
Markus
Loading...