Ankündigung

Einklappen
Keine Ankündigung bisher.

Doppelte/Mehrfache Datenbankeinträge vermeiden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doppelte/Mehrfache Datenbankeinträge vermeiden

    Hallo zusammen,

    ich versuche mich gerade daran Werte aus einem Formular in die Datenbank zu schreiben.
    Funktioniert soweit auch alles wunderbar.

    Wie kann ich es aber verhindern das der User durch aktualisieren des Browsers und bestätigen von erneutem absenden des Formulars ein weiteren doppelten Eintrag einzutragen?

    Vielen Dank für jeden Hinweis!

    Viele Grüße
    tBauer


  • #2
    Nach dem versenden umleiten, so dass POST verloren geht, bspw.
    Oder aber dem Formular eine TAN mitgeben und diese als "benutzt" markieren
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Im Grunde gar nicht. Du kannst es nur auf vorhandenseins gewisser Felder (zB E-Mail) verhindern. Wenn er aber Phantasiewerte eingibt dann nicht. Musst sonst mit einem Login arbeiten, dann geht das besser.

      EDIT: Mir ging es jetzt um das bewusste Aktualisieren bzw. neu ausfüllen. Für irrtümliche gilt das auch - bedingt(!).

      Bzw. siehe (alternativ zum TAN verfahren) zB auch: https://de.wikipedia.org/wiki/Post/Redirect/Get

      Siehe bzgl. TAN zB auch hier. Ist von einem Forenuser hier ( jspit ) : http://jspit.de/?page=antibot

      LG
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        ein weiteren doppelten Eintrag einzutragen?
        Unique Constraint auf die Spalten deiner Tabelle, die nicht doppelt vorkommen dürfen.
        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

        Kommentar


        • #5
          Prinzipiell 4 Dinge, die auch kombiniert werden können/sollten:

          1. Submit-Button nach dem Drücken mit JavaScript deaktivieren.
          2. Post-Redirect-Get-Pattern
          3. Einen einmalig gültigen Token generieren und in der Session speichern. Dieser wird dann im Formular mitgesendet. Beim zweiten mal ist der Token ungültig und die Abfrage wird abgewiesen.
          4. Unique Constraint/Index in der Datenbank.

          Kommentar


          • #6
            Hallo zusammen,

            durchweg sehr hilfreiche Tipps, vielen Dank!

            Habe das ganze jetzt mit Unique Constraint gelöst.

            Lösung:
            - Neues Datenbankfeld - Unique
            - User IP in Hash Wert umwandeln

            PHP-Code:
            $userIP md5($_SERVER["REMOTE_ADDR"]); 
            und in das Feld speichern

            Funktioniert!

            Kommentar


            • #7
              Zitat von tbauer Beitrag anzeigen
              Hallo zusammen,

              durchweg sehr hilfreiche Tipps, vielen Dank!

              Habe das ganze jetzt mit Unique Constraint gelöst.

              Lösung:
              - Neues Datenbankfeld - Unique
              - User IP in Hash Wert umwandeln

              PHP-Code:
              $userIP md5($_SERVER["REMOTE_ADDR"]); 
              und in das Feld speichern

              Funktioniert!

              Deine Lösung ist eher suboptimal, da so pro IP nur ein Formular abgesendet werden kann. Problematisch bei Benutzern mit statischer als auch mit dynamischer IP-Adresse.
              Spätestens in deiner lokalen Entwicklungsumgebung wird es nicht mehr klappen, da deine IP-Adresse immer die Gleiche ist.

              Ich persönlich würde dir auch das Post-Redirect-Get-Pattern vorschlagen.

              Kommentar


              • #8
                Hallo michga93,

                gerade wollte ich mich noch mal melden, da die Probleme auftreten die du aufgezählt hast.
                Habe jetzt dein Vorschlag beherzigt und auf Post-Redirect-Get-Pattern geswitcht.

                Wer mal vor dem gleichen Problem steht, hier ein simples Beispiel:

                PHP-Code:
                if ($_POST) {

                  ...

                  
                header("Location: " $_SERVER['REQUEST_URI']);
                  exit();

                Viele Grüße und danke nochmal!
                tBauer

                Kommentar


                • #9
                  Ich würde die Bedingung umkehren und ein bestimmtes Feld abfragen:
                  PHP-Code:
                  if ( !isset($_POST['feld']) ) {

                      
                  // evtl. log o.ä.
                      
                  header( ... );
                      exit();


                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10

                    Mit richtigem Statuscode versehenes Beispiel sieht so aus
                    PHP-Code:
                    header("HTTP/1.1 303 See Other");
                    header("Location: https://$_SERVER['HTTP_HOST']/path/landingsite.php");
                    exit; 

                    Kommentar


                    • #11
                      Hallo zusammen,

                      jetzt taucht bei mir aber ein Problem auf.
                      Wenn ich die eingegebenen Daten nach dem absenden noch anzeigen lassen will, funktioniert das ja so nicht.

                      Muss ich doch eine andere Möglichkeit in Betracht ziehen oder?

                      Viele Grüße
                      tBauer

                      Kommentar


                      • #12
                        Nein, dann musst du Punkt 3 und 4 aus Beitrag #5 in Betracht ziehen.

                        Kommentar


                        • #13
                          Hallo zusammen,

                          habs jetzt mit einer Session gelöst.
                          Die Session ID als unique Feld in der Datenbank.
                          Alle 60sek gibts ne neue ID.

                          Vielleicht nicht optimal, aber für meine Zwecke ok.
                          Danke nochmal an alle.

                          Kommentar

                          Lädt...
                          X