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
- require_once('db.php') – DB-Verbindung laden.
$connist danach verfügbar. - session_start() – Session starten, damit wir nach erfolgreichem Register den User direkt einloggen können.
- REQUEST_METHOD === 'POST' – Formular wurde abgeschickt. Beim ersten Aufruf (GET) wird nur das leere Formular gezeigt.
- trim() + Null-Coalescing (??) – Whitespace weg, und wenn das Feld gar nicht gesendet wurde, kommt leerer String statt Notice.
- Validierung mit if/elseif – bricht bei erstem Fehler ab und setzt
$fehler. - Prepared Statement für Username-Check – niemals
WHERE username = '$username'schreiben, das wäre SQL Injection. - password_hash(..., PASSWORD_DEFAULT) – erzeugt bcrypt-Hash. Aktuell ist DEFAULT = bcrypt, kann in Zukunft wechseln, deshalb Spalte
VARCHAR(255). - lastInsertId() – die ID des gerade eingefügten Users, wird in Session gespeichert damit sofort eingeloggt.
- header('Location: ...') + exit – Redirect.
exitnicht 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.