Andreas: unerwünschte doppelte Aktionen bei "zurück" verhindern

Hallo!
ich habe öfter das Problem, dass ich Daten oder eine variable (wie action=delete) überetrage, und wenn man dann auf "zurück" im browser klickt, passiert es dann halt schonmal, das Aktionen(Inserts....) doppelt ausgeführt werden. Wie kann ich vermeiden, dass ein User sowas aus Versehen verursacht?

Grüße
Andreas

  1. Hi,

    Wie kann ich vermeiden, dass ein User sowas aus Versehen verursacht?

    Du kannst niemals nie nie nicht vermeiden, dass der User etwas tust. Das einzige, was Deiner Kontrolle unterliegt ist das, was _Du_ tust.

    Prüfe also vor einem Insert, ob er bereits durchgeführt wurde. Ob Du das über einen Select machst (eher suboptimal, wenn auch möglich), oder ob Du eine entsprechende Information in Session-Variablen oder sonstwo ablegst, ist eine Frage Deiner Optimierung.

    Cheatah

    1. Hi!

      Du kannst niemals nie nie nicht vermeiden, dass der User etwas tust. Das einzige, was Deiner Kontrolle unterliegt ist das, was _Du_ tust.

      Ja das meinte ich auch so. Mit Select ist wirklich nicht so schlau(mit deinen Worten: suboptimal :-), einmal mehr Abfragen, aber ich weiß auch gar nicht genau, wie ich das genau überprüfen soll! ich meine das kann zum einen deutlich später sein und das soll definitiv nicht möglich sein, also scheidet eine Zeit-Abfrage aus, sollte ich alle Variablen überprüfen ob es genau so einen Datensatz gibt... und wenn es hienterher doch einen gibt mit ein paar repräsentativen  Daten...

      Prüfe also vor einem Insert, ob er bereits durchgeführt wurde. Ob Du das über einen Select machst (eher suboptimal, wenn auch möglich), oder ob Du eine entsprechende Information in Session-Variablen oder sonstwo ablegst, ist eine Frage Deiner Optimierung.

      Mit Session wäre das schon besser, aber dann müßte ich mir ja ein neues System zulegen, mit dem ich alle aktionen die nicht wiederholt ausgeführt werden dürfen definitiv erkennen kann, damit ich in einer Sessionvariable speichern kann $action_xyz=ausgefuehrt oder sowas. Hat jemand einen Tip wie man sowas vernünftig macht? Bis jetzt über gebe ich immer die Variable $action mit entsprechenden Befehlen, die im Script abgefragt werden. Ich bräuchte aber für jede Mögliche Aktion eine extra Variable, oder?

      Grüße
      Andreas

      1. Hi,

        aber ich weiß auch gar nicht genau, wie ich das genau überprüfen soll!

        Du musst zunächst (auch im Datenkonzept) dafür sorgen, dass die Einträge zweifelsfrei wiedererkannt werden können; und zwar unabhängig von den exakten Umständen des Requests (also z.B. dem Zeitpunkt).

        sollte ich alle Variablen überprüfen ob es genau so einen Datensatz gibt...

        Oder Du gibst seiner Session (falls eine existiert, versteht sich) die Information mit, dass die Daten bereits versendet wurden. Auch hier musst Du natürlich für die eindeutige Wiedererkennbarkeit sorgen.

        und wenn es hienterher doch einen gibt mit ein paar repräsentativen  Daten...

        Eine Wahrscheinlichkeitsprüfung, ob der Vorgang wiederholt wurde, muss entweder 0% oder 100% ergeben. Zwischenwerte dürfen nicht vorkommen. Sprich: Boolean, entweder ja oder nein.

        Mit Session wäre das schon besser,

        Eventuell auch nicht, das musst Du entscheiden.

        Hat jemand einen Tip wie man sowas vernünftig macht?

        Das kommt darauf an, was für Daten mit welcher Wiederholungsmöglichkeit Du wie wo wann speicherst, und was für Datenquellen Dir mit welchen Informationen unter welchen Bedingungen noch zur Verfügung stehen. Sprich: Das ganze kann entweder extrem trivial sein, oder erfordert ein ausgeklügeltes Konzept mit evtl. sehr vielen Implikationen auf das bestehende Projekt. Nur Du weißt das.

        Ich bräuchte aber für jede Mögliche Aktion eine extra Variable, oder?

        Nein, sondern nur eine Möglichkeit, den zu tätigenden Eintrag mit den bestehenden zu vergleichen. Ob Du das über Variablen löst oder anderswie, hängt von den genauen Umständen ab.

        Cheatah

      2. Moin!

        Prüfe also vor einem Insert, ob er bereits durchgeführt wurde. Ob Du das über einen Select machst (eher suboptimal, wenn auch möglich), oder ob Du eine entsprechende Information in Session-Variablen oder sonstwo ablegst, ist eine Frage Deiner Optimierung.
        Mit Session wäre das schon besser, aber dann müßte ich mir ja ein neues System zulegen, mit dem ich alle aktionen die nicht wiederholt ausgeführt werden dürfen definitiv erkennen kann, damit ich in einer Sessionvariable speichern kann $action_xyz=ausgefuehrt oder sowas. Hat jemand einen Tip wie man sowas vernünftig macht? Bis jetzt über gebe ich immer die Variable $action mit entsprechenden Befehlen, die im Script abgefragt werden. Ich bräuchte aber für jede Mögliche Aktion eine extra Variable, oder?

        Meine Idee dazu wäre: Gib dem Formular noch ein hidden-Feld mit einem Formularschlüssel mit. In einer separaten Tabelle der Datenbank führst du parallel Buch, welche Formularschlüssel ausgeliefert wurden, und welche zurückkamen. Beispielsweise könntest du die aktuelle Zeit in einem Format deiner Wahl MD5-verschlüsseln, damit eine möglichst seltsame und eindeutige Zeichenkombination rauskommt - und falls zufällig zwei parallele Benutzer zum sekundengenau gleichen Zeitpunkt das Formular erstmals laden, bau noch die IP-Adresse, den Referrer und den User-Agent-String mit ein - irgendwas eindeutiges halt. Die Session-ID würde sich auch sehr gut eignen.

        Wenn das Formular abgeschickt wieder beim Server landet, kannst du anhand des Formularschlüssels erkennen, ob das Formular ausgeliefert wurde (dann ist der Schlüssel eingetragen worden), und ob das Formular vormals schon zurückgeschickt wurde (dann ist der Schlüssel als verbraucht gekennzeichnet).

        Wenn die Formularschlüsseltabelle nicht unendlich anwachsen soll, packst du noch einen TIMESTAMP als Information hinzu und löschst beispielsweise alle Schlüssel, die älter als einen Tag sind. Wer nach Ablauf eines Tages immer noch den Browser offen hat, der ist sowieso nicht zu retten - und du erkennst im Zweifel, daß der Browserschlüssel garnicht ausgegeben wurde und bist immer noch auf der sicheren Seite.

        - Sven Rautenberg