de.comp.lang.php.* FAQ

27.2. Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform

Antwort von Kristian Köhntopp

Da jede HTML-Datei auch ein gültiges, bedeutungsgleiches PHP-Programm ist, existiert ein einfacher und systematischer Weg, um von einem HTML-Formular zu einem PHP-Programm zu kommen, das dieses Formular bearbeitet. Hält man sich an diesen Weg, wird das resultierende Formular zugleich ein bestimmtes Format haben.

Der erste Schritt ist die Entwicklung eines reinen HTML-Formulares, das die zu verarbeitenden Daten abfrägt.

In einem zweiten Schritt wird man aus diesem Formular ein sogenanntes Affenformular machen, indem man dafür sorgt, dass das Formular sich selbst aufruft und seine alten Werte immer wieder einsetzt. Es heißt Affenformular, weil eine Million Affen dieses Formular eine Million mal aufrufen können, ohne etwas zu bewirken.

<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text"
       name="textfeld"
       value="<?php if (isset($_REQUEST['textfeld'])) echo htmlspecialchars($_REQUEST['textfeld']); ?>">
<br>
<input type="submit"
       name="do_form_x"
       value="Ausführen">
</form>

Das Affenformular enthält an zwei Stellen PHP-Code: Bei 'action' wird der Dateiname des Skripts eingetragen. Durch Einsetzen von $_SERVER['PHP_SELF'] (oder vor PHP 4.1.0 $HTTP_SERVER_VARS['PHP_SELF']) an Stelle des Dateinamens kann das Formular seine eigene Adresse bestimmen und sich somit selbst aufrufen. Und außerdem werden die Defaultwerte der verschiedenen Formularfelder durch PHP wieder mit den Ausgangswerten belegt. Wenn das Formular also abgesendet wird und die Eingabewerte nicht korrekt sind, wird das Formular wieder dargestellt und die alten Werte werden als Standardwerte wieder eingesetzt. Damit kann der Anwender sie korrigieren, ohne sie noch einmal eingeben zu müssen.

Der dritte Schritt besteht dann darin, eine Reihe von Funktionen zu codieren, die die Werte aus diesem Formular validieren (siehe Wie erkenne ich fehlerhafte/fehlende Eingaben?) und ggf. die passenden Fehlermeldungen erzeugen, die dann an den geeigneten Stellen wieder in das Formular eingesetzt werden. Das Endresultat muss dann eine Variable haben, an der entscheidbar ist, ob der Formularinhalt gültig ist oder nicht.

<?php

// Funktion zum Drucken von Fehlermeldungen
function errmsg($msg) {
   ?>
   <font color="#ff0000"><b><?php print nl2br($msg) ?></b></font>
   <?php
}

// Überprüft Eingabewerte für $textfeld auf Korrektheit.
function validate_textfeld($val) {
   $msg = "";
   if (strlen($val) < 3)
      $msg .= "Die Eingabe muss mindestens 3 Zeichen lang sein.\n";

   if (preg_match("/\s/", $val))
      $msg .= "Die Eingabe darf keine Leerzeichen "
             ."oder Tabulatoren enthalten.\n";

   return $msg;
}

// Für jedes Formularfeld werden nun ein oder mehrere
// Validatoren aufgerufen und das Ergebnis der Überprüfung
// gemerkt.
$valid = true;
if (isset($_REQUEST["textfeld"])) {
   $error["textfeld"] = validate_textfeld($_REQUEST["textfeld"]);
   if ($error["textfeld"] != "")
      $valid = false;
}

?>
<form action="<?php print $_SERVER["PHP_SELF"]; ?>">
<input type="text"
       name="textfeld"
       value="<?php print htmlspecialchars($_REQUEST["textfeld"]); ?>"><br>
<?php
// Ggf. Fehlermeldung ausdrucken.
if ($error["textfeld"] != "")
   print errmsg($error["textfeld"]);
?>
<input type="submit"
       name="do_form_x"
       value="Ausführen">
</form>
<hr>
<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
<!-- Nutzlast -->
<?php } ?>

Schließlich kann man im vierten Schritt daran gehen, die validierten Formulardaten einer Bearbeitungsfunktion zu übergeben und diese Funktion die eigentliche Arbeit machen zu lassen. Das Ergebnis dieser Verarbeitung wird in den meisten Fällen unterhalb des Formulars dargestellt werden, so dass man mit den Eingabedaten oben gleich die nächste Abfrage starten kann.

An dieser Stelle hat man ein funktionierendes Formular und zwei Baustellen, an denen man weiterarbeiten kann: Zum einen muss man sich Gedanken darüber machen, welche Funktionalität aus diesem Formular an anderer Stelle so auch wieder verwendet werden könnte und sollte sich überlegen, ob man nicht eine Klasse schreiben möchte, in die man diese Funktionalität anwendungsunabhängig kapseln könnte. Auf diese Weise wird man sich Schritt für Schritt eine kleine Bibliothek an Funktionen zulegen, die in vielen anderen Projekten ebenfalls Anwendung finden kann.

Zum anderen muss man sich überlegen, ob man die Verkettung von Bildschirmen, Knöpfen und Aktionen nicht ein wenig globaler lösen kann und welche Struktur man seinem Programm dafür geben wird.

Valid HTML 4.01! Valid CSS!

27.2. Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform
http://www.php-faq.de/q/q-stil-normalform.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team