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'); } /**