Formularverarbeitung mit PHP
Links
Zielsetzung
Wir lernen, wie ein Formular auf einer Webseite verarbeitet wird.
Formular anlegen
Wir erzeugen im Verzeichnis demowebserver eine Datei login.html:
<html>
<body>
<form action="/demo.php?login" method="POST">
<p><input class="full-field" name="username" type="text" placeholder="Benutzername" value="#USERNAME#"></p>
<p><input class="full-field" name="password" type="password" placeholder="Passwort"></p>
<p><input name="remember" type="checkbox" #REMEMBER#> Angemeldet bleiben</p>
<p><button class="btn-primary button-20 full-field" name="login">Anmelden</button></p>
#ERROR#
</form>
</body>
</html>
- In form tragen wir eine neue URL in das Attribut action ein: /demo.php?login. Diese URL wird aufgerufen, wenn der Button gedrückt wird.
- Wir brauchen also die Behandlung dieser URL in demo.php:
...
} elseif ($_SERVER['REQUEST_URI'] === '/demo.php?login') {
$server->login();
...
public function login(){
$this->showPage('Anmeldung', 'login.html');
}
- Jetzt können wir auf der Startseite den Link "Anmeldung" anklicken und landen auf der Seite mit dem Formular.
- Wenn wir auf den Button Anmeldung klicken, passiert nichts.
- Wir erweitern unsere Funktion showPage():
private function showPage(string $header, string $pageFile, array $replacements = []){
$page = file_get_contents('page.html');
$body = file_get_contents($pageFile);
$page = str_replace('#HEADER#', $header, $page);
$start = strpos($body, '<body>') + 6;
$end = strrpos($body, '</body>');
$body2 = substr($body, $start, $end - $start);
$page = str_replace('#CONTENT#', $body2, $page);
foreach($replacements as $key => $value){
$page = str_replace($key, $value, $page);
}
echo $page;
}
- Es gibt jetzt einen zusätzlichen Parameter $replacements, der vorbelegt ist. Damit ist dieser optional, muss also nicht angegeben werden.
- Vor dem Ausgeben mit
echowerden auf der Seite mittels foreach-Schleife alle Ersetzungen aus dem Array $replacement getätigt. - Wir ersetzen den Aufruf in
login():
public function login(){
$replacements = ['#ERROR#' => '', '#USERNAME#' => ''];
$this->showPage('Anmeldung', 'login.html', $replacements);
}
- Jetzt ist die Marker #ERROR# und #USERNAME# verschwunden, weil der Marker jeweils durch den Leerstring ersetzt wird.
- Wir plazieren einen Breakpoint in die Zeile
$this->showPage('Anmeldung', 'login.html', ['#ERROR#' => ]);und klicken im Browser auf den Button "Anmelden". - Wir schauen uns im Debugger links die Superglobal-Variable $_POSTS an:
- Dort stehen 3 Werte: username, password und login: Das sind die 3 Namen aus dem Formular. Die Werte sind alle leer.
- Wir lassen das Programm mit F5 weiterlaufen, füllen das Formular aus und klicken auf "Anmeldung".
- Jetzt zeigt der Debugger in der Variablen $_POSTS die eingegebenen Werte in username und password an.
- Wir erweitern die Funktion login():
private function error(string $message){
$rc = "<div class=\"text-warning\">$message</div>";
return $rc;
}
private function message(string $message){
$rc = "<div class=\"text-info\">$message</div>";
return $rc;
}
public function login(){
$replacements = ['#ERROR#' => '', '#USERNAME#' => '', '#REMEMBER#' => ''];
if (array_key_exists('login', $_POST)){
$msg2 = '';
$replacements['#USERNAME#'] = $_POST['username'];
if (array_key_exists('remember', $_POST)){
$msg2 = ' und bleibst ';
$replacements['#REMEMBER#'] = 'checked';
}
if ($_POST['username'] !== 'bob'){
$replacements['#ERROR#'] = $this->error('Unbekannter Benutzer: ' . $_POST['username']);
} elseif ($_POST['password'] !== 'abc'){
$replacements['#ERROR#'] = $this->error('Falsches Passwort');
} else {
$replacements['#ERROR#'] = $this->message("Du bist $msg2 angemeldet.");
}
}
$this->showPage('Anmeldung', 'login.html', $replacements);
}
- Die Methode
error()generiert ein HTML-Konstrukt für eine Fehlermeldung. - Die Methode
mesage()generiert ein HTML-Konstrukt für eine Infomeldung. - In der Methode
login()prüfen wir, ob der Button "login" gedrückt wurde. Nur dann steht in der Variable $_POST der Eintrag "login".- Mit
array_key_exists('login', $_POST)prüfen wir, ob es einen Key 'login' in der Variable $_POST gibt.
- Mit
- Wenn der Button gedrückt wurde:
- Wir merken uns den Benutzernamen, indem wir #USERNAME# damit ersetzen. Im Formular steht dann
<input name="username" value="XXX">, wenn als Benutzername XXX eingegeben wurde. - Wenn "remember" in $_POST existiert, dann ist die Checkbox angeklickt. Wir ersetzen dann #REMEMBER# durch 'checked', damit die Checkbox angeklickt bleibt.
- Wir testen, ob der Benutzername ein bekannter Name (hier "bob") ist.
- Wenn nein, geben wir eine Fehlermeldung aus, indem wir den Marker #ERROR# mit der Fehlermeldung ersetzen.
- Wenn ja prüfen wir, ob das Passwort stimmt.
- Wenn nein, Fehlermeldung
- Wenn ja, entsprechende Meldung.
- Wir merken uns den Benutzernamen, indem wir #USERNAME# damit ersetzen. Im Formular steht dann
Fazit
- Es werden nur Eingabefelder gefunden, die innerhalb der
<form...>...</form>-Konstruktion liegen. - Alle Eingabefelder werden mit Namen versehen: dann erscheinen sie in der Superglobal-Variablen $_POST.
- Wir plazieren in der HTML-Seite Marker, die wir durch das Programm dann ersetzen.
- Wenn wir den Wert eines Eingabefeldes merken wollen, müssen wir das Attribut <value> entsprechend setzen:
value="#USERNAME#' - Checkboxen liefern nur einen Wert in $_POSTS, wenn sie angeklickt sind.