Ein einfaches Login- & Registrierungsformular (PHP & SQL) – Teil 1

Zeit für ein neues Tutorial, diesmal eine einfache Möglichkeit ein Login- und ein Registrierungsformular mit PHP zu erstellen. Außerdem möchten wir uns dann natürlich auch noch ausloggen können.

Zuerst erstellen wir die beiden Formularseiten, also die Login-Maske und das Registrierungsformular.

<?php
// PHP-Funktion, damit über mehrere Seiten hinweg
// eine Session/Sitzung ermöglicht wird.
// Wir benötigen Sie auf allen unseren Seiten
session_start();
?>
<html>
   <head>
     <title>Loginformular</title>
   </head>
<body>
<h1>Einloggen</h1>
<!-- mit action rufen wir das PHP-File auf, das die ganze Arbeit macht -->
<form action="inc/login-inc.php" method="POST">
   <input type="text" name="user" placeholder="Benutzername"><br>
   <input type="password" name="password" placeholder="Passwort"><br>
   <button type="submit" name="submit">Login</button>
</form>
<br>
<a href="signup.php">Registrieren</a>

</body>
</html>

Dieses Loginformular speichern wir unter index.php ab.

Die folgende Datei dann entsprechend unter signup.php, denn hier kann sich der Benutzer registrieren.

<html>
   <head>
     <title>Registrieren</title>
   </head>
<body>
<h1>Registrierungsformular</h1>
<form action="inc/signup-inc.php" method="POST">
   <input type="text" name="firstname" placeholder="Vorname"><br>
   <input type="text" name="lastname" placeholder="Nachname"><br>
   <input type="text" name="user" placeholder="Benutzername"><br>
   <input type="password" name="password" placeholder ="Passwort"><br>
   <button type="submit" name="submit">Registrieren</button>
</form>

</body>
</html>

Um überhaupt arbeiten zu können, brauchen wir natürlich auch eine Datenbank. Diese kann man am einfachsten mit phpMyAdmin anlegen. In diesen Fall heißt die Datenbank users und enthält eine Tabelle mit der Bezeichnung user, diese wiederum beinhaltet die Felder iduserpasswordfirstname und lastname.

Der Übersicht halber legen wir die PHP-Files in einen Unterordner, den man traditionell inc oder includes nennt. Dort brauchen wir zunächst eine Verbindung zu unserer Datenbank. Diese stellen wir in einem eigenen PHP-File db.php her:

<?php
// Kontakt zur Datenbank herstellen nach dem Muster
// Serveradress, Benutzername, Passwort, Datenbankname
$connection = mysqli_connect('localhost', 'root', '', 'loginformular');

Das ließe sich auch auf diverse andere Weisen lösen, die hier angelegte Variable $connection können wir aber später immer wieder verwenden, das erspart uns die Zugangsdaten immer wieder einzugeben. (In diesem Fall arbeiten wir lokal mit phpMyAdmin, deshalb ist der Benutzername immer root und ein Passwort ist nicht notwendig.

Legen wir als nächstes ein rudimentäres PHP für die Registrierung an. Rudimentär, weil ich an dieser Stelle auf die Error Handler verzichte, die zum Beispiel überprüfen ob eine E-Mailadresse korrekt eingegeben wurde oder das gewählte Passwort bestimmten Anforderungen entspricht. Die Datei speichern wir als signup-inc.php ab.

<?php
// IF-Abfrage, damit kein Inhalt angezeigt wird, 
// wenn ein User die URL errät
if (isset($_POST['submit'])) {

// Hier laden wir unsere Verbindung zur Datenbank
  include_once 'db.php';

// mysqli_real_escape_string sorgt dafür, dass nur Text, 
// aber kein Code in die Datenbank kommt
  $firstname = mysqli_real_escape_string($connection, $_POST['firstname']);
  $lastname = mysqli_real_escape_string($connection, $_POST['lastname']);
  $user = mysqli_real_escape_string($connection, $_POST['user']);
  $password = mysqli_real_escape_string($connection, $_POST['password']);

// Passwort verschlüsseln
  $hashPassword = password_hash($password,PASSWORD_DEFAULT);
  
// Jetzt wird der Nutzer in die Datenbank übertragen
  $sql = "INSERT INTO users (user, password, firstname, lastname) VALUES ('$user', '$hashPassword', '$firstname', '$lastname');";
  $result = mysqli_query($connection, $sql);
// Der User wird bei einem erfolgreichen Prozess auf 
// die später noch erstellte Seite dashboard.php geschickt
  header("Location: ../dashboard.php");
  exit();


} else {
// Falls jemand die URL erraten hat, wird er durch
// das else zum Registrierungsformular geschickt
    header("Location: ../signup.php");
    exit();
}

Wie gesagt, wir gehen hier mal davon aus, dass unser User intelligent ist und das Formular korrekt ausfüllen kann, eventuelle Fehlermeldungen gibt es nicht.

Als nächstes erstellen wir das PHP-File für den Login-Prozess, der mit dem Formular in index.php ermöglicht wird. Diese Datei nennen wir login-inc.php.

<?php
// Sitzung starten, damit der Benutzer eingeloggt bleibt
session_start();

if (isset($_POST['submit'])) {

    include 'db.php';

    $user = mysqli_real_escape_string($connection, $_POST['user']);
    $password = mysqli_real_escape_string($connection, $_POST['password']);

    // Error handlers
    // Existiert der Benutzername?
    $sql = "SELECT * FROM users WHERE user = '$user'";
    $result = mysqli_query($connection, $sql);
    // mysqli_num_rows gibt die Anzahl an, wie oft die Bedingung von $sql erfüllt wird
    $resultCheck = mysqli_num_rows($result);
    if ($result < 1) {
        // ?login=user gibt die Information an die index.php weiter
        header("Location: ../index.php?login=user");
        exit();
    } else {
        // Ist das Passwort korrekt?
        // Die Variable row wird als Array mit den Informationen aus der Datenbank befüllt
        if ($row = mysqli_fetch_assoc($result)) {
            // De-Hashing des Passwortes 
            // password_verify($password, $row['password']) gibt true oder false zurück
            $hashedPassword = password_verify($password, $row['password']);
            if ($hashedPassword == false) {
                header("Location: ../index.php?login=password");
                exit();
              // elseif fängt unvorhergesehene Fehler ab
            } elseif($hashedPassword == true){
              // Benutzer anmelden
              $_SESSION['session_id'] = $row['id'];
              $_SESSION['session_user'] = $row['user'];
              $_SESSION['session_firstname'] = $row['firstname'];
              $_SESSION['session_lastname'] = $row['lastname'];
              header("Location: ../dashboard.php");
              exit();
            }
        }
    }

} else {
    header("Location: ../index.php?login=error");
    exit();
}

Das wäre geschafft, allerdings möchten wir ja auch wissen ob der Benutzer auch bei einem Wechseln der Seiten eingeloggt bleibt. Dazu erstellen wir zuerst die Seite dashboard.php.

<?php
session_start();
?>

<html>
<head>
  <title>Dashboard</title>
</head>
<body>
<h1>Dashboard I</h1>

<?php
// In der If-Abfrage wird abgefragt, ob die beim Login
// gestartete Session aktiv ist
if (isset($_SESSION['session_user'])) {
    echo "<h2>Du bist angemeldet</h2>";
} else {
// Ist keine Session aktiv, kommt diese Anzeige:
    echo "<h2>Du bist nicht angemeldet</h2>";
};

?>
<br>
<!-- Hier binden wir einen Logout-Button ein -->
<form action="inc/logout-inc.php" method="POST">
   <button type="submit" name="submit">Ausloggen</button>
</form>
<br>
<a href="dashboard2.php">Seite II</a>

</body>
</html>

Und damit der Link auf "Seite II" funktioniert das gleiche leicht verändert als dashboard2.php.

<?php

session_start();

?>
<html>
<head>
  <title>Dashboard</title>
</head>
<body>
<h1>Dashboard II</h1>

<?php

if (isset($_SESSION['session_user'])) {
    echo "<h2>Du bist immer noch angemeldet</h2>";
} else {
    echo "<h2>Du bist nicht angemeldet</h2>";
};

?>
<br>

<form action="inc/logout-inc.php" method="POST">
   <button type="submit" name="submit">Ausloggen</button>
</form>

<br>
<a href="dashboard.php">Seite I</a>

</body>
</html>

Jetzt fehlt eigentlich nur noch die logout-inc.php, damit der "Ausloggen"-Button auch funktioniert:

<?php

if (isset($_POST['submit'])) {
   session_start();
   session_unset();
   session_destroy();
   header("Location: ../dashboard.php");
   exit();
}

Technisch gesehen sind wir damit natürlich schon fertig, aber das sieht alles doch ein bisschen hässlich aus, oder? Deshalb nehmen wir uns mit ein bisschen CSS der Optik an. Doch das folgt später in Teil 2 dieser kleinen Serie.

About Thomas Matterne

Thomas Matterne ist Chefredakteur des dreisprachigen Online-Magazins DenkZeit und als Online-Marketing-Manager tätig. Der ausgebildete Journalist hat ein Diplom in Wirtschaftsinformatik, und schreibt an dieser Stelle über IT-, Online-Marketing- und SEO-Themen - unteranderem.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.