310 lines
13 KiB
PHP
310 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* @file account.php
|
|
* @brief Profil- und Kontoverwaltungsseite des Benutzers.
|
|
*
|
|
* @details Diese Datei stellt die Benutzeroberfläche für das Benutzerprofil dar.
|
|
* Sie überprüft, ob eine aktive Benutzersitzung vorliegt, ruft die Benutzerdaten
|
|
* (wie Anzeigename, E-Mail und Profilbild) aus der Datenbank ab und zeigt diese an.
|
|
* Zudem bietet sie Funktionen zum Hochladen eines neuen Profilbildes, Verlinken zu
|
|
* administrativen oder benutzerspezifischen Aktionen (wie Wunschliste und Produktverwaltung)
|
|
* sowie die Möglichkeit, sich vom System abzumelden.
|
|
*
|
|
* @author Geizkragen-Projekt
|
|
* @date 2026-04-03
|
|
*/
|
|
|
|
/**
|
|
* @brief Einbinden der Bootstrap-Datei.
|
|
*
|
|
* Beinhaltet Konfigurationen, Konstanten und grundlegende Funktionen (wie z. B. DB-Verbindung),
|
|
* die für den gesamten Ablauf erforderlich sind.
|
|
*/
|
|
require_once __DIR__ . '/lib/bootstrap.php';
|
|
|
|
/**
|
|
* @brief Überprüfung der Benutzersitzung.
|
|
*
|
|
* Wenn die Session-Variable 'user_id' nicht gesetzt ist, wird der Benutzer sofort
|
|
* auf die Login-Seite weitergeleitet.
|
|
*/
|
|
if (empty($_SESSION['user_id'])) {
|
|
header('Location: login.php');
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* @var int $userId Die ID des aktuell angemeldeten Benutzers, sicher als Integer gecastet.
|
|
*/
|
|
$userId = (int)$_SESSION['user_id'];
|
|
|
|
/**
|
|
* @var mysqli $conn Das aktive Datenbankverbindungsobjekt.
|
|
*/
|
|
$conn = db_connect();
|
|
|
|
/**
|
|
* @brief Konto löschen
|
|
* Verarbeitet die Anfrage zum Löschen des eigenen Kontos.
|
|
*/
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_account'])) {
|
|
$delStmt = $conn->prepare("DELETE FROM users WHERE userID = ?");
|
|
$delStmt->bind_param('i', $userId);
|
|
$delStmt->execute();
|
|
$delStmt->close();
|
|
|
|
session_unset();
|
|
session_destroy();
|
|
header('Location: index.php');
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* @brief Vorbereiten der SQL-Abfrage zur Ermittlung der Benutzerdaten.
|
|
*
|
|
* Holt die userID, den Anzeigenamen, die E-Mail-Adresse und den Pfad zum Profilbild
|
|
* aus der Tabelle 'users' für den gerade angemeldeten Benutzer.
|
|
*
|
|
* @var mysqli_stmt|false $stmt Das vorbereitete Statement.
|
|
*/
|
|
$stmt = $conn->prepare('SELECT userID, displayName, email, profilePicture FROM users WHERE userID = ? LIMIT 1');
|
|
if (!$stmt) {
|
|
// Bei einem Fehler beim Vorbereiten der Abfrage wird ein HTTP 500 Fehler gesendet und die Ausführung gestoppt.
|
|
http_response_code(500);
|
|
die('Datenbankfehler');
|
|
}
|
|
|
|
/**
|
|
* @brief Ausführen des Statements mit der Benutzer-ID.
|
|
*/
|
|
$stmt->bind_param('i', $userId);
|
|
$stmt->execute();
|
|
|
|
/**
|
|
* @var mysqli_result|false $result Das Ergebnis der Datenbankabfrage.
|
|
*/
|
|
$result = $stmt->get_result();
|
|
|
|
/**
|
|
* @brief Auswertung des Abfrageergebnisses.
|
|
*
|
|
* Wenn ein Datensatz gefunden wurde, wird das assoziative Array in $user gespeichert, ansonsten ist $user null.
|
|
*
|
|
* @var array|null $user Enthält die Benutzerdaten oder null, wenn kein Benutzer gefunden wurde.
|
|
*/
|
|
if ($result) {
|
|
$user = mysqli_fetch_assoc($result);
|
|
} else {
|
|
$user = null;
|
|
}
|
|
|
|
// Schließen des Statements und der Datenbankverbindung zur Ressourcenfreigabe.
|
|
$stmt->close();
|
|
$conn->close();
|
|
|
|
/**
|
|
* @brief Validierung der gefundenen Benutzerdaten.
|
|
*
|
|
* Falls kein gültiger Benutzer gefunden wurde (z.B. wenn der Benutzer zwischenzeitlich aus der DB gelöscht wurde),
|
|
* wird die aktuelle Sitzung zerstört und der Nutzer zum Login-Bildschirm umgeleitet.
|
|
*/
|
|
if (!$user) {
|
|
session_unset();
|
|
session_destroy();
|
|
header('Location: login.php');
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* @brief Einbinden des HTML-Headers.
|
|
*
|
|
* Lädt den allgemeinen Kopfbereich der Webseite, inklusive CSS-Referenzen und Navigation.
|
|
*/
|
|
include 'header.php';
|
|
?>
|
|
|
|
<!--
|
|
@brief Hauptcontainer für die Account-Ansicht.
|
|
Definiert die Struktur für Profilanzeige und Einstellungen.
|
|
-->
|
|
<main class="auth" role="main">
|
|
<section class="account" aria-label="Account Bereich">
|
|
|
|
<!--
|
|
@brief Erfolgs- und Fehlermeldungen für den Profilbild-Upload.
|
|
Wertet GET-Parameter 'upload' aus, um dem Benutzer visuelles Feedback zu geben.
|
|
-->
|
|
<?php if (isset($_GET['upload']) && $_GET['upload'] === 'ok'): ?>
|
|
<p class="auth__alert__sucess account__toast" role="status">Profilbild wurde erfolgreich
|
|
aktualisiert.</p>
|
|
<?php endif; ?>
|
|
<?php if (isset($_GET['upload']) && $_GET['upload'] === 'err'): ?>
|
|
<p class="auth__alert__error account__toast" role="alert">Upload fehlgeschlagen. Bitte eine gültige
|
|
Bilddatei auswählen.</p>
|
|
<?php endif; ?>
|
|
|
|
<!-- ═══ Profil-Sidebar ═══ -->
|
|
<!--
|
|
@brief Container für die Profildaten.
|
|
Zeigt Avatar, Anzeigename, User-ID und E-Mail-Adresse an.
|
|
-->
|
|
<div class="auth__card account__profile">
|
|
<!-- Avatar-Anzeige -->
|
|
<div class="account__avatar-wrapper">
|
|
<img class="account__avatar"
|
|
src="<?php echo htmlspecialchars($user['profilePicture']); ?>"
|
|
alt="Profilbild von <?php echo htmlspecialchars($user['displayName'], ENT_QUOTES, 'UTF-8'); ?>"
|
|
width="180">
|
|
</div>
|
|
|
|
<!-- Name des Benutzers -->
|
|
<h1 class="account__displayname"><?php echo htmlspecialchars($user['displayName'], ENT_QUOTES, 'UTF-8'); ?></h1>
|
|
|
|
<!-- Zusätzliche Details -->
|
|
<dl class="account__details">
|
|
<div class="account__detail-row">
|
|
<dt>User-ID</dt>
|
|
<dd>#<?php echo (int)$user['userID']; ?></dd>
|
|
</div>
|
|
<div class="account__detail-row">
|
|
<dt>E-Mail</dt>
|
|
<dd><?php echo htmlspecialchars($user['email']); ?></dd>
|
|
</div>
|
|
</dl>
|
|
</div>
|
|
|
|
<!-- ═══ Einstellungen ═══ -->
|
|
<!--
|
|
@brief Container für Account-Einstellungen.
|
|
Beinhaltet Abschnitte für Profilbild ändern, Schnellaktionen und das Ausloggen.
|
|
-->
|
|
<div class="account__settings">
|
|
|
|
<!-- Profilbild ändern -->
|
|
<!--
|
|
@brief Formular zum Hochladen eines neuen Profilbilds.
|
|
Es wird ein POST-Request mit multipart/form-data an upload.php gesendet.
|
|
-->
|
|
<div class="auth__card account__section">
|
|
<h2 class="account__section-title">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
|
|
<circle cx="8.5" cy="8.5" r="1.5"/>
|
|
<polyline points="21 15 16 10 5 21"/>
|
|
</svg>
|
|
Profilbild ändern
|
|
</h2>
|
|
<form class="auth__form" action="upload.php" method="post" enctype="multipart/form-data">
|
|
<div class="auth__field">
|
|
<label for="file">Neue Bilddatei auswählen</label>
|
|
<input type="file" name="uploadFile" id="file" accept="image/*" required>
|
|
<p class="auth__tip">Erlaubt: JPG / PNG · max. 20 MB</p>
|
|
</div>
|
|
<div class="auth__actions">
|
|
<button class="auth__submit" type="submit">Hochladen</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- Schnellaktionen -->
|
|
<!--
|
|
@brief Bereich für schnellen Zugriff auf wichtige Funktionen.
|
|
Wenn der Benutzer die Rolle ADMIN hat, werden zusätzliche Links angezeigt.
|
|
-->
|
|
<div class="auth__card account__section">
|
|
<h2 class="account__section-title">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<path d="M12 5v14M5 12h14"/>
|
|
</svg>
|
|
Schnellaktionen
|
|
</h2>
|
|
<div class="account__quick-actions">
|
|
<?php
|
|
/**
|
|
* @brief Prüfung der Administrator-Rolle.
|
|
* Falls der Benutzer ein Admin ist, werden Links zur Produkt- und Benutzerverwaltung gerendert.
|
|
*/
|
|
if (!empty($_SESSION['user_roles']) && in_array('ADMIN', $_SESSION['user_roles'], true)):
|
|
?>
|
|
<a href="productAdder.php" class="auth__submit account__action-link">
|
|
Produkt hinzufügen
|
|
</a>
|
|
<a href="offerAdder.php" class="auth__submit account__action-link" style="margin-top: 10px; background-color: #f59e0b;">
|
|
Angebot hinzufügen
|
|
</a>
|
|
<a href="admin_users.php" class="auth__submit account__action-link" style="margin-top: 10px; background-color: #3b82f6;">
|
|
Benutzerverwaltung
|
|
</a>
|
|
<?php endif; ?>
|
|
<!--
|
|
@brief Link zur Wunschliste für alle Benutzer.
|
|
-->
|
|
<a href="wunschliste.php"
|
|
class="auth__submit account__action-link account__action-link--secondary">
|
|
Meine Wunschliste
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Abmelden -->
|
|
<!--
|
|
@brief Logout-Bereich.
|
|
Stellt ein Formular bereit, das ein Ausloggen aus der Anwendung ermöglicht.
|
|
-->
|
|
<div class="auth__card account__section account__section--danger">
|
|
<h2 class="account__section-title account__section-title--danger">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/>
|
|
<polyline points="16 17 21 12 16 7"/>
|
|
<line x1="21" y1="12" x2="9" y2="12"/>
|
|
</svg>
|
|
Sitzung beenden
|
|
</h2>
|
|
<p class="account__danger-text">Du wirst ausgeloggt und musst dich erneut anmelden.</p>
|
|
<form action="logout.php" method="post">
|
|
<div class="auth__actions">
|
|
<button class="auth__submit auth__submit--danger" type="submit">Abmelden</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- Konto löschen -->
|
|
<!--
|
|
@brief Bereich zum Löschen des Kontos.
|
|
-->
|
|
<div class="auth__card account__section account__section--danger" style="margin-top: 2rem;">
|
|
<h2 class="account__section-title account__section-title--danger" style="color: #ef4444;">
|
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor"
|
|
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
<polyline points="3 6 5 6 21 6"></polyline>
|
|
<path d="M19 6V20a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>
|
|
<line x1="10" y1="11" x2="10" y2="17"></line>
|
|
<line x1="14" y1="11" x2="14" y2="17"></line>
|
|
</svg>
|
|
Konto löschen
|
|
</h2>
|
|
<p class="account__danger-text">Diese Aktion ist unwiderruflich. Alle deine Daten werden gelöscht.</p>
|
|
<form action="account.php" method="post" onsubmit="return confirm('Bist du sicher, dass du dein Konto endgültig löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden!');">
|
|
<input type="hidden" name="delete_account" value="1">
|
|
<div class="auth__actions">
|
|
<button class="auth__submit" style="background-color: #ef4444; border-color: #ef4444;" type="submit">Konto unwiderruflich löschen</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<?php
|
|
/**
|
|
* @brief Einbinden des HTML-Footers.
|
|
*
|
|
* Schließt die HTML-Struktur ab und lädt mögliche globale Skripte.
|
|
*/
|
|
include 'footer.php';
|
|
?>
|