Formularverarbeitung mit PHP

Aus Vokabulabor
Version vom 17. Oktober 2023, 18:41 Uhr von Hamatoma (Diskussion | Beiträge) (→‎Formular anlegen)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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).