Patty: Doppelklick bei Formularen verhindern / Reloadsperre + Redirect

Hey Forum!

Ich möchte mir eine Funktion zur Verarbeitung von Formularen schreiben.
Meine erste Hürde ist, wie ich einen Doppelklick auf den submit-Button des Formulars abfangen oder verhindern kann. Natürlich ohne Client-Seitiger Lösung.

Das nächste Problem ist dann natürlich der Reload-Button des Browsers. Um den zu umgehen, muss ich mir eine Redirect-Lösung überlegen.

Könnt ihr mir dabei bitte helfen?
Die Funktion müsste natürlich über allen anderen Ausgaben in einer Datei ausgeführt werden. Also noch bevor z.B. der DOCTYPE oder irgendwas anderes an den Browser geschickt wird.

Herzlichen Dank!

Patty

  1. Ich möchte mir eine Funktion zur Verarbeitung von Formularen schreiben.
    Meine erste Hürde ist, wie ich einen Doppelklick auf den submit-Button des Formulars abfangen oder verhindern kann. Natürlich ohne Client-Seitiger Lösung.

    Schau mal ein paar Threads weiter unten.
    Da hat jemand dieselbe Frage gehabt. Taste F5 blockieren oder so ähnlich.

    Sowas geht sehr gut über eine Unique Id (php bietet dafür eine Funktion an, die Dir diese ID gibt). Die gibst Du über post dem Formular mit auf den Weg und speicherst sie z.B in Deiner db. Die post-Daten werden nur dann ausgewertet, wenn die ID noch nicht in Deiner db steht, ansonsten wars ein Mehrfachabsenden des Formulars.

    Gruß, Karl

  2. Moin!

    Die Antwort hast Du schon gegeben:

    Formular.php

    <?php session_start()  
    $_SESSION['unique']=false;  
      
    function myUnique() {  
      if isset($SERVER['UNIQUE_ID']) {  
          return $SERVER['UNIQUE_ID'];  
      } else {  
          return md5($_SERVER['SERVER_ADDR'].microtime().rand(1000,9999));  
      }  
    }  
      
    ?>
    

    <form method="POST" action="/auswert.php">
    <input name="unique" type="hidden" value="<?php myUnique(); ?>">
    ...

    auswert.php:

    <?php  
    session_start();  
    if (isset($_POST['unique'] && $_POST['unique']==$_SESSION['unique']) {  
      echo '<h1>Hoppla. Schon gesendet!</h1>';  
      /*  
       Oder was immer Du dann tun willst. Sorge auf jeden Fall dafür, dass hier Schluss ist:  
      */  
      exit;  
    }  
    # else  
    $_SESSION['unique']=$_POST['unique'];  
    /*  
     tu dies, tu das ... aber sende nichts!  
    */  
    header('Location: http://'.$SERVER['HTTP_HOST'].'/antwort.php")  
    ?>
    

    antwort.php:

    <?php  
    /*  
     load all your stuff into a fine template, send this and exit.  
    */  
    ?>
    

    Gegen mehrfaches Klicken des Submit-Buttons muss man meines Wissens nichts unternehmen.

    Wenn Du es ganz hart nehmen willst, dann bilde über alle Elemente von $_POST einen String, jage den durch md5() und speichere das in einem versteckten Formularfeld. Alternativ kannst Du unique id (oder eine Kombination aus IP-Adresse des Senders und microtime(), sowie einen Zufallswert nutzen, ebenfalls durch md5() jagen und im Formularfeld speichern.

    Kommt die Anfrage rein, dann schaue nach, ob der unique-Wert in der Session steht. Wenn nicht werte die übrigen Daten aus und schreibe ihn in die Session damit er beim zweiten Versuch drin steht. Leite gleich zu einer Antwort-Seite weiter. Braucht die antwort.php Daten, dann schreibe diese in der auswert.php in die Session.

    Steht in $_SESSION['unique'] und $_POST['unique'] drin, dann wurde doppelt gesendet, breche auf geeignete Weise ab.

    Das obige ist ein Beispiel und nicht getestet. Es kann fehlerhaft sein.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

  3. hi,

    Ich möchte mir eine Funktion zur Verarbeitung von Formularen schreiben.
    Meine erste Hürde ist, wie ich einen Doppelklick auf den submit-Button des Formulars abfangen oder verhindern kann. Natürlich ohne Client-Seitiger Lösung.

    Mein Lösung:

    Jedes Form kriegt eine eindeutige Ticket-Id, die wird einmal in das Form gegeben und gleichzeitig auf dem Server gespeichert.

    Beim Submit wird
    * geprüft ob es die Ticket-ID gibt
    * ob das Zeitfenster stimmt
    * bei erfolgreichen Submit die Ticket-ID auf dem Server gelöscht.

    Damit der Ticket-Pool nicht unermäßlich anwächst wg. nicht-abgeschickten Forms, kriegt jedes Ticket auch einen Zeitstempel fürs Verfalldatum. Das Löschen verfallener Tickets kann von einem extra Prozess übernommen werden, oder vom Script selbst, was einmal das Form erzeugt und den Submit verarbeitet.

    Horst Haselhuhn