decocode decocode deco    

Reload von Formularen verhindern #

Wenn der Besucher einer Seite ein Formular abgeschickt hat, kann es durch beabsichtigtes Neuladen der Zielseite (z. B. durch Drücken von F5) oder durch Betätigen des ›zurück‹-Buttons des Browsers dazu kommen, dass die Formulardaten erneut gesendet werden. Normalerweise wird eine Warnmeldung ausgegeben, die dies verhindern soll. Der Besucher hat hier aber nur die Möglichkeit, den Aufruf der Seite abzubrechen oder die Formulardaten wirklich neu zu senden. In der Regel ist das unerwünscht und kann durch folgende Maßnahme verhindert werden.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
  $file = "eingabe.txt";
  if (!file_exists($file)) touch($file);
  if ($_POST['eingabe']) {
    $handle = fopen($file, "w");
      fwrite($handle, $_POST['eingabe']);
    fclose($handle);
    header("Location: http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']);
    exit;
  } else {
    echo "<form action='formular.php' method='post'>";
    echo "<input type='text' name='eingabe'>";
    echo "<input type='submit' value='abschicken'></form>";
    echo "POST: ".file_get_contents($file)."<br>";
    $handle = fopen($file, "w");
      ftruncate($handle, 0);
    fclose($handle);
  }
?>

Dieses Beispiel verdeutlicht das Prinzip. Unmittelbar nach dem Auswerten der Formulardaten (in diesem Fall wird die Eingabe in die Datei eingabe.txt geschrieben) wird mit der Funktion header() ein Header erzeugt, der auf eine beliebige Seite weiterleitet, in diesem Fall die gleiche Seite. Zur Überprüfung des Verhaltens wird am Ende des Formulars der Inhalt der Datei eingabe.txt angezeigt. Wenn man nun die Seite neu lädt, wird nicht die Seite geladen, die die Formulardaten empfangen hat, sondern die, auf die der Header weitergeleitet hat. Dadurch wird ein erneutes Posten verhindert. Auch der ›zurück‹-Button bewirkt kein Neuladen, da die Seite, die die Formulardaten empfangen hat, offenbar nicht in der History des Browsers gespeichert wurde.