158 lines
5.4 KiB
PHP
158 lines
5.4 KiB
PHP
<?php
|
|
/**
|
|
* @file wunschliste.php
|
|
* @brief Darstellung der persönlichen Wunschliste eines Benutzers
|
|
*
|
|
* @details Diese Datei ist dafür verantwortlich, alle Produkte anzuzeigen,
|
|
* die der aktuell eingeloggte Benutzer zu seiner Wunschliste hinzugefügt hat.
|
|
* Sie greift auf die Datenbank zu, um die Verknüpfung zwischen Benutzer
|
|
* (über die aktuelle Session) und den favorisierten Produkten (aus der Tabelle userFavorites)
|
|
* herzustellen.
|
|
* @author Geizkragen-Team
|
|
* @version 1.0
|
|
* @since 1.0
|
|
*/
|
|
|
|
// wunschliste.php
|
|
|
|
/**
|
|
* @brief Einbinden der grundlegenden Bootstrapping-Konfiguration
|
|
* @details Die Datei bootstrap.php lädt Helferfunktionen, Konfigurationsdaten
|
|
* und initialisiert die Session, wodurch Zugriffe auf $_SESSION möglich werden.
|
|
*/
|
|
require_once __DIR__ . '/lib/bootstrap.php';
|
|
|
|
/**
|
|
* @brief Herstellen der Datenbankverbindung
|
|
* @details Ruft db_connect() auf, um eine Instanz zur Datenbank aufzubauen.
|
|
* Diese wird für das spätere Abrufen der Wunschlisten-Elemente benötigt.
|
|
* @var mysqli $conn Aktives Datenbankverbindungsobjekt.
|
|
*/
|
|
// 1) DB-Verbindung (einmal)
|
|
$conn = db_connect();
|
|
|
|
/**
|
|
* @brief Einschränkung des Datenzugriffs und Weiterleitung unbefugter Benutzer
|
|
* @details Prüft, ob ein Benutzer aktuell eingeloggt ist. Die Weiterleitung
|
|
* (HTTP-Header Location) muss zwingend erfolgen, bevor jegliche HTML-Struktur
|
|
* gerendert wurde. Danach beendet exit() sofort die Ausführung dieses Skripts.
|
|
*/
|
|
// Login-Check + Redirect MUSS vor jeglicher HTML-Ausgabe passieren
|
|
if (!isset($_SESSION['user_id'])) {
|
|
header("Location: login.php");
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* @brief Laden der Wunschlisten-Daten aus der Datenbank
|
|
* @details Ein "Prepared Statement" wird aufgebaut, um die Produktdaten (ID, Modell,
|
|
* Beschreibung, Bildpfad) sicher aus der Datenbank abzufragen. Hierbei werden die
|
|
* Tabellen 'userFavorites' und 'products' per INNER JOIN anhand der productID zusammengeführt.
|
|
* @var mysqli_stmt $stmt Das vorbereitete SQL-Statement Objekt.
|
|
*/
|
|
// Daten laden
|
|
$stmt = $conn->prepare("
|
|
SELECT products.productID, products.model, products.description, products.imagePath
|
|
FROM userFavorites INNER JOIN products ON userFavorites.productID = products.productID
|
|
WHERE userID = ?
|
|
");
|
|
|
|
/**
|
|
* @brief Binden der Nutzer-ID an das SQL-Statement
|
|
* @details Verbindet den Typ 'i' (Integer) mit dem tatsächlichen Wert der aktuellen Session-ID.
|
|
*/
|
|
$stmt->bind_param("i", $_SESSION['user_id']);
|
|
|
|
/**
|
|
* @brief Ausführung der vorbereiteten Abfrage
|
|
*/
|
|
$stmt->execute();
|
|
|
|
/**
|
|
* @brief Extrahieren der Ergebnismenge
|
|
* @details Speichert das Resulat der Abfrage, welches in der GUI anschließend durchlaufen wird.
|
|
* @var mysqli_result $result Die vom Datenbankserver zurückgelieferte Ergebnismenge.
|
|
*/
|
|
$result = $stmt->get_result();
|
|
?>
|
|
|
|
<?php
|
|
/**
|
|
* @brief Einbinden des HTML-Headers
|
|
* @details Lädt die globale Navigation, CSS-Dateien und nötige Meta-Informationen.
|
|
*/
|
|
include 'header.php';
|
|
?>
|
|
|
|
<?php
|
|
/**
|
|
* @brief Bedingung zur Anzeige der Produktliste
|
|
* @details Evaluiert, ob das vorherige Statement mindestens ein favorisiertes
|
|
* Produkt für den Benutzer zurückgeliefert hat. Ist dies der Fall, wird die
|
|
* Liste gerendert. Andernfalls erscheint ein leerer Hinweisbildschirm.
|
|
*/
|
|
if ($result->num_rows > 0):
|
|
?>
|
|
<main>
|
|
<section class="product-section">
|
|
<h2>Deine Wunschliste</h2>
|
|
<div class="wishlist-grid">
|
|
<?php
|
|
/**
|
|
* @brief Iteration über alle favorisierten Produkte
|
|
* @details In jedem Durchlauf wird ein Produkt als assoziatives Array
|
|
* zurückgegeben und direkt per HTML im Frontend abgebildet.
|
|
*/
|
|
while ($product = $result->fetch_assoc()):
|
|
?>
|
|
<?php
|
|
/**
|
|
* @brief Casting der Produkt ID
|
|
* @var int $productId Stellt sicher, dass die Produkt-ID als strenger Integer
|
|
* zur Erzeugung der Link-URL vorliegt.
|
|
*/
|
|
$productId = (int)$product['productID'];
|
|
?>
|
|
<a class="product-card wishlist-card" href="productpage.php?id=<?= $productId ?>">
|
|
<img
|
|
src="<?= isset($product['imagePath']) ? $product['imagePath'] : 'assets/images/placeholder.png' ?>"
|
|
alt="<?= htmlspecialchars($product['model']) ?>">
|
|
|
|
<div class="product-card__content">
|
|
<h3><?= htmlspecialchars($product['model']) ?></h3>
|
|
<p><?= htmlspecialchars($product['description']) ?></p>
|
|
</div>
|
|
</a>
|
|
<?php endwhile; ?>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
<?php else: ?>
|
|
<?php
|
|
/**
|
|
* @brief Fallback Ansicht
|
|
* @details Dieser Abschnitt wird angezeigt, wenn der Nutzer noch
|
|
* keine Artikel als Favoriten markiert hat.
|
|
*/
|
|
?>
|
|
<main style="padding: 2rem 1rem; text-align: center; animation: fadeInUp 0.5s ease both;">
|
|
<p style="color: var(--text-secondary); font-size: 1rem;">Deine Wunschliste ist noch leer.</p>
|
|
</main>
|
|
<?php endif; ?>
|
|
|
|
<?php
|
|
/**
|
|
* @brief Freigabe der SQL-Ressourcen
|
|
* @details Schließt das PreparedStatement sicher und räumt belegten Speicher wieder auf.
|
|
*/
|
|
$stmt->close();
|
|
?>
|
|
|
|
<?php
|
|
/**
|
|
* @brief Einbinden des HTML-Footers
|
|
* @details Rendert rechtliche Links sowie abschließende Skripte für die Seite.
|
|
*/
|
|
include 'footer.php';
|
|
?>
|