From 92bb400f029fc89745dc21c5dad32eea20d11bbc Mon Sep 17 00:00:00 2001 From: Deploymentcenter Bot Date: Fri, 7 Aug 2026 22:06:39 +0200 Subject: [PATCH] fix(webui): e() nimmt jeden skalaren Wert entgegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Seite brach beim Aufbau ab und lieferte im Browser "switchMainTab is not defined": das Rendering endete vor dem Script-Block, sodass keine einzige Funktion definiert wurde. Ursache: e() war als ?string deklariert. PHP wandelt numerische Array-Schlüssel automatisch in int um, sodass die Zeitraum-Auswahl im Fehler-Stream mit den Schlüsseln 0/1/24/168/720 einen int übergab. Unter declare(strict_types=1) warf das einen TypeError mitten in der Ausgabe. Die enge Signatur war generell unpassend: mit ATTR_STRINGIFY_FETCHES = false liefert PDO numerische Spalten als int, und genau diese Werte werden über e() ausgegeben. Die Funktion nimmt jetzt jeden skalaren Typ entgegen. Gefunden hat den Fehler die Selbstmeldung: die unbehandelte Exception landete als Item im eigenen Bugtracker, inklusive Datei und Zeilennummer. Die übrigen typisierten Helfer (dc_dt, dc_ago, getMonitorIconUrl, btUrl, errUrl) wurden gegengeprüft; sie erhalten ausschließlich Strings bzw. Arrays. Co-Authored-By: Claude Opus 5 --- public/index.php | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/public/index.php b/public/index.php index d0f651c..7f5ca39 100644 --- a/public/index.php +++ b/public/index.php @@ -144,10 +144,37 @@ if ($pendingMigrations !== []) { // Hilfsfunktionen fuer die Ausgabe // ====================================================================== -/** Kurzform fuer htmlspecialchars mit sicheren Voreinstellungen. */ -function e(?string $value): string +/** + * Kurzform fuer htmlspecialchars mit sicheren Voreinstellungen. + * + * Nimmt bewusst jeden skalaren Typ entgegen, nicht nur ?string. Zwei Quellen + * liefern hier regelmaessig Integer: + * - PDO gibt mit ATTR_STRINGIFY_FETCHES = false numerische Spalten als int + * zurueck, und genau diese Werte werden ausgegeben. + * - PHP wandelt numerische Array-Schluessel automatisch in int um, sodass + * foreach ($optionen as $wert => $label) bei Schluesseln wie '24' einen + * int liefert. + * + * Mit declare(strict_types=1) warf eine ?string-Signatur dabei einen + * TypeError - und da diese Funktion mitten im Seitenaufbau steht, brach das + * Rendering ab, bevor der Script-Block ausgegeben wurde. Im Browser + * aeusserte sich das als "switchMainTab is not defined". + * + * @param mixed $value + */ +function e($value): string { - return htmlspecialchars($value ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + if ($value === null) { + return ''; + } + if (is_bool($value)) { + return $value ? '1' : ''; + } + if (is_array($value) || is_object($value)) { + return ''; + } + + return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } /**