hawkmaster1: Doppelte Inserts vermeiden , Browser Refresh

Hallo zusammen,

wie könnte man am besten verhindern das durch F5 oder Browser Refresh zwei oder mehr gleiche Inserts in eine DB gemacht werden? Die meisten Tipps gehen hier in Richtung Weiterleitung mit header wie; exit (header('Location: danke.php'));

Ich möchte dies aber nicht da auf der gleichen Seite mehrmals Sumbits oder Eingaben mit unterschiedlichen Daten gemacht werden sollen. Da wäre eine Weiterleitung sehr Benutzer unfreundlich.

Ich habe es daher mal mit Sessions ausprobiert.

if( $_SESSION['cmd_SaveData'] == $_POST['cmd_SaveData'] && isset($_SESSION['cmd_SaveData'])){	   //doppelter Submit bzw. refresh
//echo "Sie haben schon einmal gespeichert";
}
else {
//Erste Speicherung
$_SESSION['cmd_SaveData'] = $_POST['cmd_SaveData']; 
..
//Insert in DB
..
} 

Das funktioniert zwar und verhindert bei F5 das man zweimal speichern kann. Aber es verhindert natürlich auch das jemand weitere male mit anderen Daten speichern kann.

Wie habt ihr so etwas umgesetzt? Bin für jede Anregung offen.

viele Grüße hawk

  1. Hallo hawkmaster1,

    Das funktioniert zwar und verhindert bei F5 das man zweimal speichern kann. Aber es verhindert natürlich auch das jemand weitere male mit anderen Daten speichern kann.

    Generiere für jedes Rendering eine Unique-ID, die du beim Datensatz mit speicherst. Wenn der User einen Refresh auslöst und damit die Formular-Daten erneut übermittelt, dann ist die Unique-ID die gleiche wie vorher und du lehnst das Update ab. Ist die ID eine andere, dann kannst du gefahrlos speichern.

    LG,
    CK

    1. Hallo Christian, danke dir.

      Generiere für jedes Rendering eine Unique-ID, die du beim Datensatz mit speicherst. Wenn der User einen Refresh auslöst und damit die Formular-Daten erneut übermittelt, dann ist die Unique-ID die gleiche wie vorher und du lehnst das Update ab. Ist die ID eine andere, dann kannst du gefahrlos speichern.

      ja so etwas habe ich mir auch schon überlegt. Die Frage ist nur sollte man die Unique ID z.b wie folgt generieren? $_SESSION['uniquetoken'] = md5(session_id() . time()); Wenn nach dem Absenden und erstmaligen speichern in der DB, nach ein paar Sekunden F5 gedrückt wird hat man doch eine neue Zeit und der Token wäre wieder unterschiedlich, also gültig?

      Gruss hawk

      1. Hallo hawkmaster1,

        ja so etwas habe ich mir auch schon überlegt. Die Frage ist nur sollte man die Unique ID z.b wie folgt generieren? $_SESSION['uniquetoken'] = md5(session_id() . time());

        Ich sprach explizit von „beim Datensatz speichern.“ ;) Da bleibt die ID immer gleich, bis du sie überschreibst. Und wenn der User „F5 drückt,“ dann wird die alte ID mit übermittelt.

        Wenn nach dem Absenden und erstmaligen speichern in der DB, nach ein paar Sekunden F5 gedrückt wird hat man doch eine neue Zeit und der Token wäre wieder unterschiedlich, also gültig?

        Nein, denn du schickst die ID ja im Formular mit. Und die Formulardaten werden einfach nur neu übermittelt, da ändert sich nichts. Aber wie gesagt: übermittele sie im Formular, nicht in der Session.

        LG,
        CK

      2. Hallo und guten Morgen,

        ja so etwas habe ich mir auch schon überlegt. Die Frage ist nur sollte man die Unique ID z.b wie folgt generieren? $_SESSION['uniquetoken'] = md5(session_id() . time());

        Du könntest es erst einmal mit $_SERVER['UNIQUE_ID'] versuchen, wenn Du einen Apache benutzt der mod_unique_id geladen hat.

        Das ist allerdings nur ein Hilfsmittel. Es ist nicht manipulationsfest.

        Grüße
        TS

  2. Tach!

    wie könnte man am besten verhindern das durch F5 oder Browser Refresh zwei oder mehr gleiche Inserts in eine DB gemacht werden?

    Das kann man datenbankseitig mit einem Unique-Index regeln. Die Kombination von Feldern, die nicht mehrfach vorhanden sein darf, wird in einen Unique-Index aufgenommen und dann beschwert sich das DBMS, wenn der ein zweites Mal eingefügt werden soll. Diesen Fehler muss man nur noch beim Abfangen als gutartig bewerten.

    dedlfix.

    1. Hallo dedlfix, danke dir.

      wie könnte man am besten verhindern das durch F5 oder Browser Refresh zwei oder mehr gleiche Inserts in eine DB gemacht werden?

      Ja das kenne ich und habe ich an manchen Tabellen so gemacht. Es gibt jedoch auch Situationen wo man solch einen Unique Index nur schwer machen kann. Beispiel: man hat eine Tabelle wo "Tag", "Aufwandzeit", "AnwenderID" erfasst wird. Der Anwender dürfte ja ma gleichen Tag mehrere gleiche Zeiten erfassen. (Ok, ja vielleicht durch zusätzliche Parameter wie "Aufwandart" könnte man es wieder eindeuting machen)

      Gruss hawk

      1. Hallo und guten Morgen,

        wie könnte man am besten verhindern das durch F5 oder Browser Refresh zwei oder mehr gleiche Inserts in eine DB gemacht werden?

        Ja das kenne ich und habe ich an manchen Tabellen so gemacht. Es gibt jedoch auch Situationen wo man solch einen Unique Index nur schwer machen kann. Beispiel: man hat eine Tabelle wo "Tag", "Aufwandzeit", "AnwenderID" erfasst wird. Der Anwender dürfte ja ma gleichen Tag mehrere gleiche Zeiten erfassen. (Ok, ja vielleicht durch zusätzliche Parameter wie "Aufwandart" könnte man es wieder eindeuting machen)

        Das hat Christian Dir schon geschrieben. Liefer mit dem leeren Formular oder beim Update mit dem mit geholten Werten gefüllten einen künstlichen Uniqe-Key als hidden-value mit aus. Den speicherst Du dann beim Insert oder beim Update in einer eigenen Unique-Spalte mit ab.

        Grüße
        TS

  3. Tach,

    wie könnte man am besten verhindern das durch F5 oder Browser Refresh zwei oder mehr gleiche Inserts in eine DB gemacht werden? Die meisten Tipps gehen hier in Richtung Weiterleitung mit header wie; exit (header('Location: danke.php'));

    Ich möchte dies aber nicht da auf der gleichen Seite mehrmals Sumbits oder Eingaben mit unterschiedlichen Daten gemacht werden sollen. Da wäre eine Weiterleitung sehr Benutzer unfreundlich.

    du kannst doch aber wieder auf die ursprüngliche Seite weiterleiten und diese wieder passend füllen. Und ein F5 funktioniert dann auch nicht, wenn du ein Post/Redirect/Get-Schema nutzt.

    mfg
    Woodfighter