fix(webui): e() nimmt jeden skalaren Wert entgegen

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 <noreply@anthropic.com>
This commit is contained in:
Deploymentcenter Bot
2026-08-07 22:06:39 +02:00
co-authored by Claude Opus 5
parent 60e34b29f6
commit 92bb400f02
+30 -3
View File
@@ -144,10 +144,37 @@ if ($pendingMigrations !== []) {
// Hilfsfunktionen fuer die Ausgabe // 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');
} }
/** /**