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 die Adresse neulädt, an die die Daten übergeben wurden oder wenn er bei Netscape-Browsern die Größe des Browserfensters ändert, was ebenfalls ein Neuladen der Adresse 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
   {
      $db->query("INSERT INTO tabelle
                  SET name = '{$_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.

hosted by
schlund + partner

Valid HTML 4.01! Valid CSS!

11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
http://www.dclp-faq.de/q/q-formular-mehrfach.html
de.comp.lang.php FAQ | (c) Copyright 2000-2003 Das dclp-FAQ-Team