Formularverarbeitung mit PHP

Aus Vokabulabor
Zur Navigation springen Zur Suche springen

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">
      <div class="panel">
        <p class="wide"><input class="full-field" name="username" type="text" placeholder="Benutzername" value="#USERNAME#"></p>
        <p class="wide"><input class="full-field" name="password" type="password" placeholder="Passwort"></p>
        <p class="wide"><input name="remember" type="checkbox" #REMEMBER#> Angemeldet bleiben</p>
        <p class="wide"><button class="btn btn-primary full-field" name="login">Anmelden</button></p>
        #ERROR#
      </div>
  </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-danger bg-white\">$message</div>";
        return $rc;
    }
    private function message(string $message){
        $rc = "<div class=\"text-primary bg-white\">$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.
  • 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.

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).