Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Denkfehler bei Doppelpost-Verhinderung?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Denkfehler bei Doppelpost-Verhinderung?

    Hi Leute,

    ich programmiere gerade ein Formular, in das man Kommentare eintragen kann.

    Damit der Kommentar nicht mehrfach in die Datenbank eingefügt wird, wenn man die Seite refresht, habe ich einen Mechanismus entwickelt, bei dem der Kommentar bei jedem weiteren Mal abschicken in einem hidden-Feld mitgeschickt wird.
    Beim Absenden des Formulars wird so überprüft, ob das hidden-Feld "last" den gleichen Wert hat, wie der abgeschickte Kommentar.

    Ich frage mich jetzt nur, wo mein Denkfehler liegen könnte, da dieser Mechanismus vorhin schonmal funktioniert hat, und jetzt leider nicht mehr. Ich weiß aber leider auch nicht, nach welcher Code-Änderung das wohl passiert sein könnte.

    Vielleicht habt ihr eine Idee, wo mein Denkfehler liegen könnte.

    Hier der dazugehörige Codeschnipsel:
    PHP-Code:
            $last_post $_POST['kommentar'];
            echo 
    "<br>last:".$last_post;
            
    //wenn User angemeldet, dann Berechtigung Kommentare zu schreiben
            
    if($_SESSION['user']){
                
    $output .= "\t\t".'<form action="projekt_view.php" method="post" class="input">'."\n";
                 
    $output .= "\t\t\t\t".'<textarea name="kommentar" cols="60" rows="10" style="float:left;"></textarea>'."\n";
                 
    $output .= "\t\t".'<div class="komm" style="padding:10px; float:left;">'."\n";
                
    $output .= "\t\t\t".'<h1><input type="submit" value="Kommentar absenden"></h1>'."\n";
                
    $output .= "\t\t\t".'<input type="hidden" name="komm" value="sent">'."\n";
                
    $output .= "\t\t\t".'<input type="hidden" name="last" value="'.$last_post.'">'."\n";
                
    $output .= "\t\t\t".'<input type="hidden" name="id" value="'.$this->projekt_id.'">'."\n";
                
    $output .= "\t\t".'</div>'."\n";
                
    $output .= "\t\t".'</form>'."\n";
                if(
    $_POST['kommentar']==""&&$_POST['komm']=="sent"){
                    
    $output .= "\t\t".'<br>'."\n";
                    
    $output .= "\t\t".'<br>'."\n";
                    
    $output .= "\t\t".'<h3 style="clear:both; padding:10px;">Bitte trage einen Kommentar ein!</h3>'."\n";

                } 
    //in der folgenden Abfrage liegt der Knackpunkt:
    elseif($_POST['kommentar']&&$_POST['last']!=$_POST['kommentar']){
                    echo 
    "<br>POST-KOMMENTAR: ".$_POST['kommentar'];
    //der echo-Wert POST-LAST-POST wird leider nicht ausgegeben
                    
    echo "<br>POST-LAST-POST: ".$_POST['last'];
                    echo 
    "<br>ID: ".$_POST['id'];
                    
                    
    //schreiben der Werte in die DB
                
    }
            } 

  • #2
    Also, um das nochmal nachvollziehen zu können:

    Man trägt einen Kommentar ein, sendet ihn ab und landet danach wieder auf der gleichen Seite und könnte nochmals auf "absenden" klicken? Oder gibt es eine Weiterleitung nach dem Absenden und du möchtest nur verhindern, dass man auf "zurück" klicken kann und nochmals auf "Absenden" ? Oder wie?
    Ich kann's mir jetzt grad nicht so wirklich vorstellen... Ein paar genauere Angaben oder vielleicht ein Link zur Seite wären sicher hilfreich.
    Gruß estebu

    Kommentar


    • #3
      Also, um das nochmal genauer zu erklären:

      Über der Liste mit den bisherigen Kommentare befindet sich ein Eingabefeld.
      Man schreibt einen Kommentar rein und klickt dann auf den Button "Absenden". Daraufhin wird dieser eingetragen, aber auf der gleichen Seite, es wird also keine neue Seite geladen, sondern der Button "Absenden" verweist auf die gleiche Seite, nur dass halt was per Post abgeschickt wird.

      Wenn man nochmal auf den Button klicken würde, würde nichts passieren, da das Eingabefeld dann wieder leer ist.

      Das Problem besteht dann, wenn man auf Absenden klickt und danach nochmal per Aktualisieren/F5 die Seite per Hand refresht, da ja hier erneut der Post-Wert übergeben wird und in die Datenbank eingetragen wird.

      Ich hoffe, ich habe mich jetzt klarer ausgedrückt.

      Kommentar


      • #4
        Mit header weiterleiten, oder ein Token im Formular plazieren.
        Signatur:
        PHP-Code:
        $s '0048656c6c6f20576f726c64';
        while(
        $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

        Kommentar


        • #5
          danke bystones für deine antwort.

          ich weiß leider weder, was du mit header weiterleiten meinst, noch, was ein token ist.

          könntest du mir das wohl nochmal näher erläutern? mit deinem code-schnipsel kann ich sonst wenig anfangen, sorry.

          Kommentar


          • #6
            PHP: header - Manual

            Du kannst den User per Location-header weiterleiten, so dass dann keine POST-Daten mehr übergeben werden.

            Kommentar


            • #7
              header: s.h. Post über mir.
              Bei einem Token legst du einen zufälligen Wert in der Session ab und schreibst ihn in das Formular, per verstecktem Feld, wenn er das Formular dann abschickt, siehst du nach ob die beiden Werte übereinstimmen, wenn ja dann machst du weiter, wenn nein dann brichst du die verarbeitung ab.
              Natürlich musst du bei ja auch den Session Wert löschen.
              Wenn der User nach einmaligem abschicken des Formulars zurück geht, ist der Wert aus der Session weg und das Formular wird nicht nochmla verarbeitet.

              Grüße

              Falls du das oben nicht verstanden hast: Let me google that for you
              Signatur:
              PHP-Code:
              $s '0048656c6c6f20576f726c64';
              while(
              $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

              Kommentar


              • #8
                Hm ok... Habs mir mal auf Deutsch durchgelesen (http://uk3.php.net/manual/en/function.header.php). Habs aber nicht wirklich verstanden, vermutlich weiß ich zu wenig über das, was im Header so passiert...

                Jedenfalls hab ich mir das mit diesem Token auch mal durchgelesen (http://www.phpblogger.net/2007/03/21...rn-mit-tokens/). Aber das löst ja das Problem eines Refreshs nicht. Da werden die Daten ja alle erneut versendet, also auch der Token, und alles wird als Doppelpost erneut in die DB geschrieben.

                P.S. Hab den Beitrag geschrieben, als ich deine Antwort noch nicht gelesen hatte. Verstehe ich das richtig, dass nach dem (ersten Mal) Schreiben in die DB der Session-Wert geresettet wird und der Formular-Wert somit beim zweiten Mal absenden nicht mehr mit dem Session-Wert übereinstimmt?

                Kommentar


                • #9
                  nicht wenn du dafür sorgst wenn der Token nach einmaliger verwendung gelöscht/verändert wird...

                  Edit: also der Token aus der Session...

                  Kommentar


                  • #10
                    Formular-Reloads verhindern - Seite 1 von 1 - Anwendungsentwicklung | Developer | ZDNet.de
                    Signatur:
                    PHP-Code:
                    $s '0048656c6c6f20576f726c64';
                    while(
                    $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                    Kommentar


                    • #11
                      Ok, danke an alle, ich denke, ich habs verstanden (also das mit dem Token) und werde es auch so machen.

                      Der Thread kann meinetwegen geschlossen werden.

                      Kommentar


                      • #12
                        Geschlossen wird nix.

                        Hinweis:
                        [!] Bitte noch den Danke!

                        Kommentar

                        Lädt...
                        X