Inhalt

Formulare in PHP

Erstellung eines HTML-Formulars

Ein HTML-Formular dient als Schnittstelle für die Benutzereingabe. Es kann verschiedene Typen von Eingabeelementen enthalten, wie input, textarea, select etc. Die Attribute action und method im <form>-Tag definieren, wohin und wie die Daten gesendet werden.

<form action="submit.php" method="post">
  Name: <input type="text" name="name">
  Email: <input type="email" name="email">
  <input type="submit" value="Submit">
</form>

Verarbeitung von Formulardaten in PHP

Wenn der Benutzer das Formular absendet, werden die Daten an das in der action angegebene PHP-Skript gesendet. Das method-Attribut bestimmt, ob die Daten über $_GET oder $_POST zugänglich sind.

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  // Sammeln der Formulardaten
  $name = $_POST['name'];
  $email = $_POST['email'];

  // Verarbeiten der Daten hier
  echo "Name: $name<br>Email: $email";
}
?>

Validierung von Formulareingaben

Die Validierung von Formulareingaben ist ein kritischer Schritt, um sicherzustellen, dass die Daten, die von den Benutzern übermittelt werden, sicher, korrekt und nützlich sind. PHP bietet verschiedene Funktionen und Techniken zur Validierung von Eingaben an, wie zum Beispiel die Funktionen filter_var() oder preg_match().

Beispiel: Validierung einer E-Mail-Adresse

$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo "Ungültige E-Mail-Adresse";
} else {
  echo "Gültige E-Mail-Adresse";
}

Weitere Parameter neben FILTER_VALIDATE_EMAIL sind FILTER_VALIDATE_INT oder FILTER_VALIDATE_FLOAT.

Beispiel: Validierung eines Passwort mit regulären Ausdrücken

$password = $_POST['password'];
$pattern = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$/";
if (!preg_match($pattern, $password)) {
  echo "Das Passwort erfüllt nicht die Anforderungen.";
} else {
  echo "Gültiges Passwort.";
}

Beispiel, um zu überprüfen, ob ein Passwort bestimmte Anforderungen erfüllt (mindestens 8 Zeichen, mindestens ein Großbuchstabe, ein Kleinbuchstabe und eine Zahl)

Formularübermittlung per GET

Übermittlung der Variablen

<form action="http://localhost/willkommen.php" method="get">

Mit der Übermittlung der Informationen per GET werden die Formulardaten an die URL angehängt, bevor die Anfrage an der Server geschickt wird:
http://localhost/willkommen.php?name=Christian

Hinter dem ? am Ende der URL kommen die Variablenname/Variablenwerte-Paare. Werden mehrere Variablen angegeben, so sind diese durch ein & voneinander getrennt:
http://localhost/willkommen.php?name=Christian&user_id=123

Achtung: Die Daten, die an den Server geschickt werden, können in der URL verändert werden!

Das superglobale Array $_GET

https://www.php.net/manual/de/ - php.net Manual: Superglobals

Das Array $_GET ist superglobal, das heißt es ist immer verfügbar. Bei $_GET handelt es sich um ein assoziatives Array von Variablen. Assoziativ bedeutet, dass auch ein String als Index verwendet werden kann.

Der name des Input-Elements, dessen Inhalt beim Senden übergeben wird, wird als Index verwendet:

<input type="text" name="nickname">
<?php
    // Alle GET Variablen werden in einem Array $_GET gespeichert
    echo 'Hallo ' . $_GET["nickname"] . '!';
?>

Obiger Quelltext erzeugt die Ausgabe

Hallo Christian!

Überprüfen der Eingabe

Je nach Einstellung des Servers kommt es zu einem Fehler, wenn eine Variable ausgelesen wird, die nicht gesetzt wurde. Daher sollte immer eine Überprüfung mit isset() durchgeführt werden.

<?php 
    // Überprüfen, ob es das Element im Array gibt
    if ( isset ($_GET[ "nickname" ]) ) {
        $name = $_GET[ "nickname" ]; 
    } else {
        // Fehlerbehandlung
        // ...
    }
    
    if ( $name ) {
        echo "Hallo $name!<br><br>";
    }		
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">

    <label>Nickname</label><br>
    <input type="text" name="nickname" value="<?php echo $name;?>">
    <br>
    <input type="submit" value="Per GET abschicken!">
    
</form>

Beispiel eines Formulars mit Überprüfung der Daten

Die globale Variable $_SERVER['PHP_SELF'] enthält den Pfad zur aktuellen Datei.

Formularübermittlung per POST

Übermittlung der Variablen

Passwörter oder andere Informationen, die nicht ersichtlich sein sollen, dürfen nicht per GET übertragen werden, da sie sonst für alle ersichtlich sind und auch verändert werden können.

<form action="http://localhost/login.php" method="post">

Das superglobale Array $_POST

Auch das Array $_POST ist superglobal und assoziativ. Die Daten werden “unsichtbar” an den Server übergeben. So kann man darauf reagieren, ohne dass jeder sieht, welche Werte und Variablen verwendet werden.

Vereinfachtes Beispiel einer Login-Seite

<?php
    // Passwörter kommen üblicherweise aus der Datenbank 
    // und sind verschlüsselt
    $hiddenUser = "admin";
    $hiddenPassword = "12345678";

    // Benutzer und Password aus dem Array auslesen
    $password = $_POST["password"];
    $user = $_POST["user"];

    // Passwort und Benutzer überprüfen
    if (( strcmp ($user, $hiddenUser) == 0) && 
        ( strcmp ($password, $hiddenPassword) == 0 )) {
        // Login erfolgreich
        // ...
        
    } else {
        // Login-Formular anzeigen
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
    <label>Benutzer</label>
    <input type="text" name="user"><br>

    <label>Password</label>
    <input type="type" name="password"><br>
    
    <input type="submit" value="Logindaten per POST übermitteln!">
</form>
<?php
    }
?>

Aufgaben

Aufgabe 1. Kontaktformular per GET

Beispielhafte Umsetzung

Erstelle ein Kontaktformular, das die einzelnen Felder auf die Syntax hin überprüft:

Sind alle Felder richtig ausgefüllt, so soll statt dem Formular eine Erfolgsmeldung angezeigt werden:

Funktionalität

Aufgabe 2. Login-Formular per POST

Erstelle eine Login-Formular, dass den Benutzernamen und das zugehörige Passwort überprüft. Nur wenn Passwort und Benutzer richtig eingegeben werden, sollen geschützte Daten angezeigt werden.

Verwende Passwort-Hashing für das Überprüfen des Passworts. Experimentiere mit verschiedenen Hashing-Algorithmen.

Hashing
echo "Franz in MD5: " . hash('md5', 'Franz');

ergibt

Franz in MD5: 13dd8a4dcb6c8720f0d67396d4d87fab
Password Hashing

Um die Sicherheit zu erhöhen, wird beim Passwort-Hashing zusätzlich zum Hash ein zufälliges Salt (random salt) gespeichert. So ergibt sich mit jedem Aufruf ein anderer Hash.

echo "Default-Algorithmus für Passwort-Hashing: " . PASSWORD_DEFAULT . "<br>";
echo "Franz in " . PASSWORD_DEFAULT . ": " . 
        password_hash("Franz", PASSWORD_DEFAULT)."<br>";
echo "Franz in " . PASSWORD_DEFAULT . ": " . 
        password_hash("Franz", PASSWORD_DEFAULT);

ergibt

Default-Algorithmus für Passwort-Hashing: 2y
Franz in 2y: $2y$10$3ry1mwAwToA7uz3UXu8gUOs10fPLCmf/W3T95dudPZeyr2ZntsRcm
Franz in 2y: $2y$10$t5kArDQ66XsOS2lPDsS0n.qhewWEFsrzaQgk./elN33QEdFwNnnkO

Um das gehashte Passwort zu überprüfen, kann jetzt nicht mehr einfach der generierte Hash direkt mit dem (in der Datenbank) gespeicherten Hash verglichen werden.

Die Überprüfung erfolgt mit password_verify():

// Passwort generieren (wird beim Erzeugen des Passworts gemacht)
$storedHash = password_hash("Franz", PASSWORD_DEFAULT);

// Passwort überprüfen (wird beim Überprüfen des Passworts gemacht)
if ( password_verify ( "Franz", $storedHash) ) {
    echo "Passwort ist richtig: " . $storedHash;
} else {
    echo "Passwort ist falsch";
}

Funktionalität

Ressourcen

Grundlagen von PHP