From 8ee3252c51d1b38f9897b360f27e90e32a1975ed Mon Sep 17 00:00:00 2001 From: fixclean Date: Fri, 13 Feb 2026 11:03:51 +0100 Subject: [PATCH] fehlerseiten --- app/index.php | 6 ++-- app/lib/helpers.php | 87 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/app/index.php b/app/index.php index a78c2f4..6e899df 100644 --- a/app/index.php +++ b/app/index.php @@ -34,12 +34,12 @@ $validActions = ['list', 'edit', 'save', 'ports', 'delete']; // Prüfen auf gültige Werte if (!in_array($module, $validModules)) { - // TODO: Fehlerseite anzeigen + // TODO: Fehlerseite anzeigen, nutze renderClientError(...) die('Ungültiges Modul'); } if (!in_array($action, $validActions)) { - // TODO: Fehlerseite anzeigen + // TODO: Fehlerseite anzeigen, nutze renderClientError(...) die('Ungültige Aktion'); } @@ -58,7 +58,7 @@ $modulePath = __DIR__ . "/modules/$module/$action.php"; if (file_exists($modulePath)) { require_once $modulePath; } else { - // TODO: Fehlerseite oder 404 + // TODO: Fehlerseite oder 404, nutze renderClientError(...) if ($action !== 'save') { echo "

Die Seite existiert noch nicht.

".$modulePath; } diff --git a/app/lib/helpers.php b/app/lib/helpers.php index a1718d8..9746082 100644 --- a/app/lib/helpers.php +++ b/app/lib/helpers.php @@ -206,6 +206,93 @@ function dd($value): void exit; } +/** + * Zeigt eine sauber gestaltete Fehlerseite für 40x-Status-Codes mit Erklärung. + * + * @param int $statusCode Client-Error-Status (400–499) + * @param string $explanation Optionale Zusatzinfo zur Problemursache + * @param string[] $tips Handlungsvorschläge für Benutzer (optional) + */ +function renderClientError(int $statusCode, string $explanation = '', array $tips = []): void +{ + if ($statusCode < 400 || $statusCode >= 500) { + $statusCode = 400; + } + + $reasons = [ + 400 => 'Ungültige Anfrage', + 401 => 'Nicht authentifiziert', + 403 => 'Zugriff verweigert', + 404 => 'Seite nicht gefunden', + 405 => 'Methode nicht erlaubt', + 408 => 'Anfrage abgelaufen', + 429 => 'Zu viele Anfragen', + ]; + + $reason = $reasons[$statusCode] ?? 'Clientseitiger Fehler'; + $defaultExplanation = match ($statusCode) { + 400 => 'Die Anfrage konnte aufgrund fehlender oder falscher Daten nicht verstanden werden.', + 401 => 'Bitte melden Sie sich an oder verwenden gültige Zugangsdaten.', + 403 => 'Sie besitzen keinen Zugriff auf diesen Bereich.', + 404 => 'Die angeforderte Ressource existiert nicht oder wurde verschoben.', + 405 => 'Diese Aktion ist auf dem Server nicht erlaubt.', + 408 => 'Die Anfrage hat zu lange gedauert; bitte erneut versuchen.', + 429 => 'Sie senden zu viele Anfragen in kurzer Zeit.', + default => 'Die Anfrage kann nicht verarbeitet werden; überprüfen Sie die Eingaben.', + }; + + $message = $explanation !== '' ? $explanation : $defaultExplanation; + + http_response_code($statusCode); + + $css = << + + + + + Fehler {{code}} + + + +
+
+
{{status}}
+

{{code}} · {{reason}}

+

{{message}}

+ {{tips}} +

Zurück zur Startseite: Dashboard

+
+
+ + +HTML, [ + '{{code}}' => e((string)$statusCode), + '{{reason}}' => e($reason), + '{{status}}' => e(sprintf('%d Fehler', $statusCode)), + '{{message}}' => e($message), + '{{css}}' => $css, + '{{tips}}' => count($tips) === 0 + ? '' + : '', + ]); + + echo $rendered; + exit; +} + /* ========================= * Sonstiges * ========================= */