Kapitel 9
cart_add.php – Produkt in Warenkorb
Kein HTML – reine "Aktions-Datei". Bekommt POST vom Detailseite-Formular, prüft die Daten, legt das Produkt in die Session, redirected zum Warenkorb.
Der Code
cart_add.php
<?php
session_start();
require_once('db.php');
// nur post erlauben
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Location: index.php');
exit;
}
$produkt_id = (int)($_POST['produkt_id'] ?? 0);
$menge = (int)($_POST['menge'] ?? 1);
// validierung
if ($produkt_id <= 0 || $menge <= 0) {
header('Location: index.php');
exit;
}
// prüfen ob produkt überhaupt existiert und freigegeben ist
$stmt = $conn->prepare("SELECT id FROM products WHERE id = ? AND freigeben = 1");
$stmt->execute([$produkt_id]);
if (!$stmt->fetch()) {
header('Location: index.php');
exit;
}
// warenkorb initialisieren falls noch nicht existiert
if (!isset($_SESSION['warenkorb'])) {
$_SESSION['warenkorb'] = [];
}
// wenn produkt schon im warenkorb menge addieren, sonst neu setzen
if (isset($_SESSION['warenkorb'][$produkt_id])) {
$_SESSION['warenkorb'][$produkt_id] += $menge;
} else {
$_SESSION['warenkorb'][$produkt_id] = $menge;
}
// zurück zum warenkorb
header('Location: warenkorb.php');
exit;
?>
Warum so aufgebaut
- Nur POST erlauben – so kann kein präparierter GET-Link etwas in Warenkörbe schmuggeln. Klassisches "Actions ändern nur bei POST"-Muster.
- (int)-Casts überall – User-Input aus dem Formular. Selbst wenn das hidden-Feld manipuliert wurde: nach dem Cast ist es garantiert ein Integer.
- DB-Check ob Produkt existiert und freigegeben – wichtig! Ohne diesen Check könnte man beliebige Produkt-IDs in den Warenkorb legen, sogar gelöschte oder gesperrte.
- Warenkorb-Struktur: assoziatives Array –
$_SESSION['warenkorb'][produkt_id] = menge. Kompakt, kein Duplicate-Handling nötig, Menge einfach addierbar.
Merke: "Aktions-Dateien" (add, remove, delete etc.) enden immer mit
header('Location: ...'); exit;. Nie stumm sein und nie zufällig HTML rausgeben.