de.comp.lang.php.* FAQ

11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?

Antwort von Guido Haeger

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.

Valid HTML 4.01! Valid CSS!

11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.php-faq.de/q/q-formular-mehrfach.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team