Formularverarbeitung mit PHP: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
(→Fazit) |
||
Zeile 119: | Zeile 119: | ||
* Wir plazieren in der HTML-Seite Marker, die wir durch das Programm dann ersetzen. | * 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: <code>value="#USERNAME#'</code> | * Wenn wir den Wert eines Eingabefeldes merken wollen, müssen wir das Attribut <value> entsprechend setzen: <code>value="#USERNAME#'</code> | ||
* Checkboxen | * Checkboxen sind nur dann in $_POSTS, wenn sie angeklickt wurden (den Status "checked" haben). |
Version vom 17. Oktober 2023, 12:15 Uhr
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
echo
werden 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 sind nur dann in $_POSTS, wenn sie angeklickt wurden (den Status "checked" haben).