Johnny: Formulare werden doppelt verschickt - nur warum?

Hallo!

Ich bin über eine Sache gestolpert, die ich nicht verstehe, vielleicht kann mir da jemand helfen:

Auf meiner Webseite ist ein Formular, das per CGI (Mein Script ist in Perl geschrieben) an mich verschickt wird. Gegen doppelt versendete Formulare habe ich auf meiner Seite einen Javascript-Schutz gebaut, der eine Variable "gesendet" setzt, sobald das Formular versendet wurde. Klickt jetzt der User nochmal auf den Button "Abschicken", erscheint eine Nachricht "einmal absenden ist ausreichend" und das nochmalige Versenden des Formulares wird verhindert (so denn Javascript eingeschaltet ist).

Nun erhalte ich manchmal (!), wenn ich selbst mein Formular teste, zwei Rückmeldungen - und bei mir ist Javascript eingeschaltet. Problematisch ist das, weil ich einen Counter habe, der dann einmal zuweit zählt.

Nun ist in der einen Zusendung folgendes Feld enthalten:

Button: Abschicken

In der zweiten Zusendung, die zeitgleich eintrifft und auch nicht durch doppeltes Klicken verursacht worden sein kann (denn das wird ja abgefangen), taucht dieses Feld "Button:" überhaupt nicht auf...?!?

Ich habe bereits probiert, per Javascript das Dokument-Feld "Button" auf den Wert "Abschicken" zu prüfen, aber der Wert ist immer gesetzt.

Jetzt bin ich am überlegen, wie ich dieses doppelt versendete Formular abfangen kann. Vorher müßte ich aber verstehen, WIESO denn überhaupt zwei Formulare verschickt werden. Denn ich habe definitiv nur einmal auf den Button geklickt. Woher kommt denn das zweite Formular? <stirnrunzel> Kann mir da jemand weiterhelfen?

Muchas Gracias!
JOhnnY

  1. Hi,

    In der zweiten Zusendung, die zeitgleich eintrifft und auch nicht durch doppeltes Klicken verursacht worden sein kann (denn das wird ja abgefangen), taucht dieses Feld "Button:" überhaupt nicht auf...?!?

    dann hast Du vermutlich erst das Formular mit Enter abgeschickt und noch während der Ladezeit auf den Button geklickt.

    Cheatah

  2. Hallo!

    Das kann Dir ohne den Quellcode wohl keiner sagen. Vielleicht hast Du ja aus versehen einen Fehler im Javascript? Oder keinen richtigen Fehler nur das der Browser aus igrndeinem Grund durch das Javascript das Formular erneut absendet, man weiß es nicht!

    Serverseitig könntest Du das z.B. mit einer Session abfangen, Du könntest z.B. beim empfangen der Daten eine Sessionvariable auf einen bestimmten Wert setzen, und wenn die Variable schon auf diesem Wert steht, machst Du halt nichts, bzw. gibst eine Fehlermeldung aus und ermöglichst es ggfs die Daten zu ändern oder was auch immer Du da vorhast. Wenn sich der User vorher eingeloggt brauchst Du keine Session, dann kannst Du das mit jedem x-beliebigen Zähler zusammen mit der UserID machen. Genauso kannst Du ein hidden Field ins Formular schreiben, und immer wenn das gesetzt ist diese Variable in die session schreiben und wenn die Variable nicht gesetzt ist diese ggfs aus der Session löschen,   so bekommst Du sofort mit wenn die Variable 2 mal hintereinander geschickt wurde! Für das eine Formular brauchst Du wenn Du das nicht willst keine Session, Du müßtest Dir dann aber so einen Mechanismus etwas vereinfacht nachbauen! Wobei das bestimmt mehr Arbeit ist, zumindest in PHP erheblich mehr!

    Grüße
    Andreas

  3. Guten Morgen,

    Auf meiner Webseite ist ein Formular, das per CGI (Mein Script ist in Perl geschrieben) an mich verschickt wird. Gegen doppelt versendete Formulare habe ich auf meiner Seite einen Javascript-Schutz gebaut, der eine Variable "gesendet" setzt, sobald das Formular versendet wurde. Klickt jetzt der User nochmal auf den Button "Abschicken", erscheint eine Nachricht "einmal absenden ist ausreichend" und das nochmalige Versenden des Formulares wird verhindert (so denn Javascript eingeschaltet ist).

    Da fällt mir doch glatt eine Idee ein. Weiß nicht, ob das geht, aber vielleicht hilft mir jemand denken...

    Wenn das Script ausgeliefet wird, ist der Senden-Button disabled. Wenn JavaScript existiert, kann man ihn damit enablen. Und Das Submitten löst wiederum ein disable aus, sodass das "alte" Script nicht nochmal abgeschickt werden kann.

    Wo liegt der Pferdefuß? Sonst wäre doch schon jemand drauf gekommen!

    Liebe Grüße

    Tom

    1. Hallo,

      Wo liegt der Pferdefuß? Sonst wäre doch schon jemand drauf gekommen!

      Tja - man kann ein Formular auch ohne Submit-Button absenden (Enter in Textfeld). Aber Dein Vorschlag ließe sich dennoch realisieren:

      <form name="formular" action="..." method="post" onSubmit="return !document.formular.submitbutton.disabled;">

      So wird auch das sichergestellt.

      ABER: Wenn Du die Seite, die erscheint, sobald das Formular abgeschickt wurde, neu lädst, dann weden die Daten wieder an den Server geschickt und kein JavaScript kann das absichern.

      Beim Formulare 2x absenden Problem gibt's wirklich nur eine _zuverlässige_ Lösung: Serverseitig mit Sessions. Da könntest Du dann z.B. ein Flag setzen.

      Grüße,

      Christian

      1. Guten Morgen Christian,

        Mit JavaScript-Funktionen habe ich es soweit auch hinbekommen.

        <form name="formular" action="..." method="post" onSubmit="return !document.formular.submitbutton.disabled;">

        ^
        wofür steht das Ausrufezeichen?

        So wird auch das sichergestellt.

        ABER: Wenn Du die Seite, die erscheint, sobald das Formular abgeschickt wurde, neu lädst, dann weden die Daten wieder an den Server geschickt und kein JavaScript kann das absichern.

        Beim Formulare 2x absenden Problem gibt's wirklich nur eine _zuverlässige_ Lösung: Serverseitig mit Sessions. Da könntest Du dann z.B. ein Flag setzen.

        Ja, richtig ausschließen können wird man das doch nur mit Authentication. Dann würde das Formular dem User gar kein zweites Mal angeboten werden.

        Grüße

        Tom

        1. Hallo Tom,

          <form name="formular" action="..." method="post" onSubmit="return !document.formular.submitbutton.disabled;">

          wofür steht das Ausrufezeichen?

          logische Negation: wenn der Button _nicht_ disabled ist, dann soll er es erlauben.

          Grüße,

          Christian