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.

  1. Hallo !
    Danke erstmal dass du das online gestellt hast.
    Ich bin ganz neu im Programmieren und hab dein coding nachgemacht 😉
    Wie ist das genau mit dem Registrieren Button – um einen Eintrag in die Datenbank zu schreiben, muss der auf db.php verlinken? Oder ganz was anderes?

    Würde mich freuen wenn du mir weiterhilfst 🙂

    Liebe grüße

    1. Der Submit-Button führt das PHP-Skript aus, das zu Beginn des Formulars angeben wurde:

      , also tatsächlich die Datei signup-inc.php. Bei einem Button vom Typ Submit selbst muss man da nichts mehr angeben.
  2. Wenn ich einen Benutzer registriere, werde ich zwar zum dashboard weitergeleitet, aber da steht dann „du bist nicht angemeldet“ und es wird kein eintrag in der Datenbank erstellt. Woran könnte das liegen?

      1. Fehler gefunden und behoben, die Tabelle muss users heißen und die Felder sind als test anzulegen. Zu dem in der db.php den datenbanknamen von Loginformular nach users umbenennen

        Gruß

        1. Ich habe die Tabelle umbenannt und auch db.php angepasst. Ich verstehe allerdings nicht, was mit „Felder sind als test anzulegen“ gemeint ist. Soll das vielleicht text heißen? Ich erhalte auf den Registrierungsversuch immer die Meldung „The requested URL was not found on this server.“

        2. Möchten Sie vielleicht kurz nochmal genau erklären, was sie verändert haben an der Ursprungsidee?

          Ich habe eine Datenbank für ein Anwendung die „42licious“ heißt und die Tabelle „users“ enthält.
          Allerdings bekomme ich die Meldung, dass ich nicht angemeldet bin.

          Bin gespannt aus eine Rückmeldung:)

  3. Servus und Hallo,

    vielen Dank für die Erklärungen.

    Ich komme gerade seit Tagen nicht weiter. Ich kann zwar User registrieren ( werden auch in die DB eingetragen), es erfolgt allerdings keine Anmeldung und die Seite dashboard wird aufgerufen mit dem Hinweis nicht angemeldet.
    Ich habe das komplette Script durchsucht aber ich finde den Fehler nicht. 🙁

    Wäre super wenn ich Support bekommen könnte.

  4. Servus und Hallo,
    NACHTRAG:

    über die Einloggen Seite bleibt er auf der Seite und ich kann das zigmal wiederholen.

    Über die Registrieren Seite wird der User angelegt und die dashboard Seite wird angezeigt ( allerdings nicht angemeldet).

    Das spricht ja dafür, dass die Anmeldebedingung nicht erfüllt ist.

    Wie gesagt, ich wäre für Support seeeerhr dankbar ! 🙂

    VG,
    Dirk

  5. Ich würde gerne wissen wie man einen Error Handler einbaut weil ich dazu kein tutorial gefunden habe und es echt gerne in meine Website einbauen würde da das Registrieren ja sonst nichts bringt wäre lieb wenn mir jemand antwortet
    Damit man mir auch eine EMAIL chreiben kann hinterlasse ich meine Email adresse
    lennart.kocksch1908@gmail.com

  6. Hallo, gute Hilfe aber ich habe das Problem das wenn ich mich einlogge oder registriere, ich nicht auf die Dashboard Seite 1 komme sondern das Programm bei Signup-inc oder login-inc stoppt.Außerdem werrden auch nciht die Datensätze gespeichert in der Tabelle.Vielleicht ein Problem mit der Datenbankverbnindung?

  7. Pingback: php seite nur mit
  8. Moin also ich habe die meisten Probleme lösen können.
    Achtet unbedingt auf die Tabellennamen in eurer datenbank bzw auch den namen der tabelle. also Users und user. In der Datenbank muss für ID ein Null wert akzeptiert werden sonst scheitert es direkt am anfang. ihr könnt das testen indem ihr bei phpmyadmin den INSERT befehl aus der Signup-inc.php mal probiert. Dort gibt es konkrete fehlermeldungen.
    Testet dort also zuerst ob der user überhaupt angelegt wird beim registrieren.

    Dann ist der Redirect vom logout button noch fehlerhaft. der header sollte vermutlich wieder zum index führen. Das ist in der logout-inc zu ändern.

    ein problem habe ich selbst noch… wenn ich mich mit falschen oder garkeinen login daten anmelde (login) bekomme ich keine fehlermeldung sondern werde auf die login-inc verwiesen. die seite ist natürlich leer.

  9. Welche Dateien müssen eigentlich in den inc-Ordner und welche nicht?
    Hab die Dateien

    dashboard.php
    dachboard2.php
    db.php
    login-inc.php
    logout-inc.php und
    signup-inc.php
    im inc-Ordner und wenn ich auf der Index.php auf „registrieren“(den Link) klicke, sehe ich dann nur ein weißes Fenster 🙁

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.