Hans Berger: FORM bei F5 nicht erneut senden

Hallo Leute,

ein User läßt einen neuen Eintrag speichern und klickt danach F5. Dadurch wird die Anfrage erneut gesendet, kommt wieder durch meine Plausis und wird erneut gespeichert.

Ich habe dieses Problem schon mehr oder weniger gelöst, indem ich einfach nachlese, ob der Datensatz bereits auf der Datenbank steht, aber bei einer Messagebox (eine Art Chat) funzt das nicht.

Ein Benutzer sollte die Möglichkeit haben, 5 mal ja zu schreiben, wenn ihn ein anderer was fragt. Wenn er aber F5 drückt, soll die Antwort nicht nochmal geschrieben werden.

Wenn die Daten verarbeitet wurden, sollen sie aus dem F5-Cache gelöscht werden.

Ich weiß nicht, ob das überhaupt in PHP möglich ist - javascript ginge auch oder HTML.

Hoffe ihr könnt mir weiterhelfen.

MFG Hans.

  1. hallo Hans,

    Ein Benutzer sollte die Möglichkeit haben, 5 mal ja zu schreiben, wenn ihn ein anderer was fragt. Wenn er aber F5 drückt, soll die Antwort nicht nochmal geschrieben werden.

    speichere zusätzlich eine Id zum Posting, z.B. über ein hidden-input, die du statt des Inhalts abfragst

    grüße,
    henman

    --
    "Sir! We are surrounded!" - "Excellent! We can attack in any direction!"
    1. speichere zusätzlich eine Id zum Posting, z.B. über ein hidden-input, die du statt des Inhalts abfragst

      Warum? Es ist ein leichtes zu prüfen, ob ein Datensatz mit exakt denselben Werten bereits übermittelt wurde (nebst automatisch eingefügter Werte wie etwa eine ID des Datensatzes oder einem Zeitstempel).

  2. ein User läßt einen neuen Eintrag speichern und klickt danach F5. Dadurch wird die Anfrage erneut gesendet, kommt wieder durch meine Plausis und wird erneut gespeichert.

    Ja es gibt Situationen, in welchen ein Resubmit (der ja vom Client aus immer möglich ist) unerwünscht ist.

    Ich habe dieses Problem schon mehr oder weniger gelöst, indem ich einfach nachlese, ob der Datensatz bereits auf der Datenbank steht, aber bei einer Messagebox (eine Art Chat) funzt das nicht.

    Ein Ansatz wäre, dass du einen Hash (zum Beispiel über sha1) über die geposteten Daten bildest. Diesen Hash musst du irgendwo loggen (z.B. im Chatlog) und kannst ihn dann abfragen.
    Dies kann unabsichtliche Doppelpostings abfangen.

    Wenn du verhindern willst, dass aus dem gleichen Formular mehrmals etwas gesendet werden kann, dann muss dein Formular eine unique ID enthalten und mitsenden.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Hi,

      Ein Ansatz wäre, dass du einen Hash (zum Beispiel über sha1) über die geposteten Daten bildest. Diesen Hash musst du irgendwo loggen (z.B. im Chatlog) und kannst ihn dann abfragen.

      Das allein hilft ihm ja nicht, wenn es nur um die Antwort „Ja“ geht, die auch absichtlich fünf mal hintereinander gegeben werden kann.

      Es ist also erforderlich, zusätzliche Daten in den Hash aufzunehmen und diese ggf. vorher zu generieren - bspw. eine Art Ticket/ID, die nur ein mal zum Posten verwendet werden kann.

      Oder nach dem POST-Request Umleitung auf eine per GET anzufordernde Ressource.

      Alles in allem ein Thema, dass schon mehrfach ausführlich diskutiert wurde.
      @Frager: Bitte erst mal suchen und recherchieren, danke.

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Hi!

    Wenn die Daten verarbeitet wurden, sollen sie aus dem F5-Cache gelöscht werden.

    Es gibt keinen browserübergreifend verwendbaren F5-Cache. Vom technischen Standpunkt her müssen zum Wiederholen eines Request natürlich auch die dabei versendeten Daten mitgeschickt werden, ansonsten wäre es ein anderer und nicht mehr der gleiche Request. Das Verhalten ist also so notwendig. Da die Browserhersteller jedoch wissen, dass dieses Verhalten trotzdem oftmals nicht gewünscht ist, haben sie ja da die "Wollen Sie wirklich die Daten nochmal neu senden?"-Abfrage eingebaut. Wenn das deine Besucher ignorieren, dann wollen sie das so. Eine Variante, eine Verarbeitung zu verhindern wurde ja mit der Verwendung eines Einmalkriterium schon genannt. Ansonsten ist noch üblich, nach erfolgreichem POST-Request ein Redirect zum Client zu senden, auf dass er danach sofort einen GET-Request absetzt. Diesen kann man so oft neu laden, wie man will. Außerdem überschreibt er üblicherweise den History-Eintrag, so dass man beim Zurück nur auf dem Formular landet. Es sei denn, man hat die Affenformulartechnik angewendet und der Nutzer hat Ehrenrunden drehen müssen, dann sind das auch wieder über die History erreichbare POST-Requests.

    Lo!