7 von 16

Shop · Kapitel 7 von 16

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

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. Doppeltes session_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.

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