4 von 16

Auth · Kapitel 4 von 16

PHP · MySQL · HTML/CSS – Schritt für Schritt

Kapitel 3

register.php – Neuen User anlegen

Ablauf: Formular anzeigen → beim Absenden Eingaben validieren → prüfen ob Username schon existiert → Passwort hashen → in DB einfügen → direkt einloggen und weiterleiten.

Der Code

register.php
<?php
require_once('db.php');
session_start();

$fehler = '';

// nur wenn formular abgeschickt wurde
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username'] ?? '');
    $email = trim($_POST['email'] ?? '');
    $password = $_POST['password'] ?? '';
    $password_repeat = $_POST['password_repeat'] ?? '';

    // validierung
    if ($username === '' || $email === '' || $password === '') {
        $fehler = 'Bitte alle Felder ausfüllen.';
    } elseif ($password !== $password_repeat) {
        $fehler = 'Passwörter stimmen nicht überein.';
    } elseif (strlen($password) < 6) {
        $fehler = 'Passwort muss mindestens 6 Zeichen haben.';
    } else {
        // check ob username schon existiert
        $stmt = $conn->prepare("SELECT id FROM users WHERE username = ?");
        $stmt->execute([$username]);
        if ($stmt->fetch()) {
            $fehler = 'Benutzername ist bereits vergeben.';
        } else {
            // passwort hashen und user einfügen
            $hash = password_hash($password, PASSWORD_DEFAULT);
            $stmt = $conn->prepare("INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)");
            $stmt->execute([$username, $email, $hash]);

            // direkt einloggen und weiterleiten
            $_SESSION['user_id'] = $conn->lastInsertId();
            $_SESSION['username'] = $username;
            header('Location: index.php');
            exit;
        }
    }
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Registrieren</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
<?php include('navbar.php'); ?>

<h1>Registrieren</h1>

<?php if ($fehler !== ''): ?>
    <p style="color: red;"><?= htmlspecialchars($fehler, ENT_QUOTES, 'UTF-8') ?></p>
<?php endif; ?>

<form action="register.php" method="POST">
    <label>Benutzername:<br>
        <input type="text" name="username" required>
    </label><br><br>

    <label>E-Mail:<br>
        <input type="email" name="email" required>
    </label><br><br>

    <label>Passwort:<br>
        <input type="password" name="password" required>
    </label><br><br>

    <label>Passwort wiederholen:<br>
        <input type="password" name="password_repeat" required>
    </label><br><br>

    <button type="submit">Konto erstellen</button>
</form>
</body>
</html>

Was passiert Schritt für Schritt

  1. require_once('db.php') – DB-Verbindung laden. $conn ist danach verfügbar.
  2. session_start() – Session starten, damit wir nach erfolgreichem Register den User direkt einloggen können.
  3. REQUEST_METHOD === 'POST' – Formular wurde abgeschickt. Beim ersten Aufruf (GET) wird nur das leere Formular gezeigt.
  4. trim() + Null-Coalescing (??) – Whitespace weg, und wenn das Feld gar nicht gesendet wurde, kommt leerer String statt Notice.
  5. Validierung mit if/elseif – bricht bei erstem Fehler ab und setzt $fehler.
  6. Prepared Statement für Username-Check – niemals WHERE username = '$username' schreiben, das wäre SQL Injection.
  7. password_hash(..., PASSWORD_DEFAULT) – erzeugt bcrypt-Hash. Aktuell ist DEFAULT = bcrypt, kann in Zukunft wechseln, deshalb Spalte VARCHAR(255).
  8. lastInsertId() – die ID des gerade eingefügten Users, wird in Session gespeichert damit sofort eingeloggt.
  9. header('Location: ...') + exit – Redirect. exit nicht vergessen, sonst läuft das Script weiter.
Prüfer-Frage: "Warum nicht md5 oder sha1 für Passwörter?" → Weil die zu schnell zu berechnen sind (GPU knackt Milliarden pro Sekunde) und keinen Salt haben. password_hash() nutzt bcrypt mit automatischem Salt und Cost-Faktor.
htmlspecialchars() bei jeder Ausgabe – auch wenn hier "nur" der Fehler-Text ausgegeben wird, ist die Angewohnheit wichtig. Jede Variable, die ins HTML fließt, wird escaped. Schutz gegen XSS.

16 Kapitel · ein Projekt

Der Codeinander Lernpfad

DEEN in Vorbereitung

Grundlagen

01GrundlagenIntro & Setup 02GrundlagenDatenbank-Schema 03Grundlagendb.php – Verbindung

Auth

04Authregister.php 05Authlogin.php 06Authlogout.php

Shop

07Shopnavbar.php 08Shopindex.php – Liste 09Shopproductdetail.php

Warenkorb

10Warenkorbcart_add.php 11Warenkorbwarenkorb.php 12Warenkorbcart_remove.php

Admin

13Adminstatistiken.php + Admin 14Admincheckout.php + Rechnung

Referenz

15ReferenzSQL-Cheatsheet 16Referenzzertifizierung-Checkliste