Kapitel 6
navbar.php – Navigation
Wird in jede Seite mit include('navbar.php') eingebunden. Zeigt Home, alle Kategorien aus der DB, und je nach Login-Status entweder Register/Login oder Warenkorb/Logout. Admins sehen zusätzlich "Statistiken".
Der Code
navbar.php
<?php
require_once('db.php');
// session_start nur wenn noch keine läuft
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
?>
<ul>
<li class="navbar"><a href="index.php">Home</a></li>
<?php
$stmt = $conn->query("SELECT id, name FROM categories");
$kategorien = $stmt->fetchAll();
foreach ($kategorien as $kategorie) {
// htmlspecialchars für xss-schutz
echo '<li><a href="index.php?cat_id=' . (int)$kategorie['id'] . '">'
. htmlspecialchars($kategorie['name'], ENT_QUOTES, 'UTF-8')
. '</a></li>';
}
?>
<?php if (isset($_SESSION['user_id'])): ?>
<?php if (($_SESSION['rolle'] ?? '') === 'admin'): ?>
<li><a href="statistiken.php">Statistiken</a></li>
<?php endif; ?>
<li>Servus, <?= htmlspecialchars($_SESSION['username'], ENT_QUOTES, 'UTF-8') ?>!</li>
<li><a href="warenkorb.php">Warenkorb</a></li>
<li><a href="logout.php">Logout</a></li>
<?php else: ?>
<li><a href="register.php">Register</a></li>
<li><a href="login.php">Login</a></li>
<?php endif; ?>
</ul>
Wichtige Details
- session_status() === PHP_SESSION_NONE – Check bevor
session_start(), weil die einbindende Seite schon eine Session gestartet haben kann. Doppeltessession_start()wirft Notice. - Kategorien dynamisch aus DB – bei einer neuen Kategorie in der DB erscheint sie automatisch im Menü. Kein Hardcoding.
- (int) beim Cast –
$kategorie['id']zwar aus der DB (also sicher), aber Cast schadet nie und ist konsistent zur Verteidigung gegen falschen Content. - Admin-Menüpunkt nur wenn rolle=admin – der einfachste Rollen-Check. Der eigentliche Schutz ist aber in statistiken.php selbst, denn die URL könnte man ja auch direkt eingeben.
Wichtig zu verstehen: das Verstecken in der navbar ist keine Sicherheit, nur UX. Sicherheit ist immer der Check auf der Zielseite selbst.