dclp FAQ

FAQ der Newsgroups de.comp.lang.php.*

 
  • Increase font size
  • Default font size
  • Decrease font size

Variablen und Formulare

Wie verhindere ich mehrfaches Absenden eines Formulars?

E-MailDruckenPDFLesezeichen anlegen: Du musst dich einloggen um ein Lesezeichen für diesen Beitrag anzulegen. Es wird deiner persönlichen Lesezeichenliste hinzugefügt.

Daten die ein Script aus Formularen übergeben bekommt, sollen meist in Datenbanken gespeichert werden. Dabei sollen in der Regel Dubletten vermieden werden. Diese können z.B. entstehen, wenn der User den URI neulädt, an den die Daten übergeben wurden oder wenn er bei Netscape-Browsern die Größe des Browserfensters ändert, was ebenfalls ein Neuladen bewirkt. Ein mögliches Verfahren zur Vermeidung solcher Dubletten wird in der Frage "Wie kann ich eine schummelsichere Abstimmung codieren?" beschrieben (Einsatz einer Challenge), ein anderes mögliches Verfahren ist ein Redirect per Location-Header nach der erfolgreichen Ausführung der gewünschten Aktionen (z.B. Speichern der Daten in einer Datenbank).

<?PHP
function formular_ausgeben($error = '')
{
   $error = ($error=='')?'':'<font color="#DD0000">'.$error.'</font>';
   return '<form action="script.php4" method="POST">
           '.$error.'
           Name: <input type="text" name="name" value="'.$_REQUEST['name'].'" />
           <br />
           <input type="submit" name="submit" value="OK" />
           </form>';
}
 
function daten_speichern()
{
   GLOBAL $db;
   if(strlen($_REQUEST['name']) < 3)
   {
      return formular_ausgeben('Bitte Namen eingeben!<br>');
   }
   else
   {
      // Mit $db->escape_string() wird eine Funktion aufgerufen, die sicher stellt
      // das möglicherweise in $_REQUEST['name'] enthaltene SQL-Fragmente nicht
      // ausgeführt werden (siehe auch mysql_escape_string() ).
      $db->query("INSERT INTO tabelle
                  SET name = '".$db->escape_string($_REQUEST['name'])."'");
 
      if($db->affected_rows() == 1)
      {
         header('Location: http://domain.de/script.php4?d=bestaetigen');
         return '<a href="http://domain.de/script.php4?d=bestaetigen">weiter</a>';
      }
      else
      {
         return formular_ausgeben('MySQL: '.$db->Error.'<br>');
      }
   }
}
 
function bestaetigung()
{
   return 'Der Name wurde gespeichert.';
}
 
 
if($_REQUEST['submit'] == 'OK')
{
   echo daten_speichern();
}
elseif($_REQUEST['d'] == 'bestaetigen')
{
   echo bestaetigung();
}
else
{
   echo formular_ausgeben();
}
?>

Ein Neuladen nach erfolgreichem Abspeichern der Daten führt hier nur zur erneuten Ausgabe der Bestätigung. Die Daten werden nicht erneut in die Datenbank geschrieben.

Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.php-faq.de/q-formular-mehrfach.html
 

dclp FAQ


Login