PDO::ERRMODE_EXCEPTION] ); $check = $masterPdo->prepare('SELECT 1 FROM sys.databases WHERE name = ?'); $check->execute([$dbName]); if (!$check->fetch()) { $safeName = str_replace(']', ']]', $dbName); $masterPdo->exec("CREATE DATABASE [{$safeName}]"); } } catch (\Throwable) { // Let the main connection fail with its own error if master access fails } } function database(): Database { static $database = null; if ($database === null) { /** @var array $config */ $config = require __DIR__ . '/../config/database.php'; ensureSqlServerDatabase($config); $database = new Database($config); } return $database; } function migration_manager(): MigrationManager { static $migrationManager = null; if ($migrationManager === null) { $migrationManager = new MigrationManager(database(), __DIR__ . '/../database/migrations'); } return $migrationManager; } // ── Session / CSRF helpers ──────────────────────────────────────────────────── function ensureSessionStarted(): void { if (session_status() === PHP_SESSION_NONE) { session_start(); } } function e(?string $value): string { return htmlspecialchars((string) $value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } function asset(string $path): string { return '/' . ltrim($path, '/'); } function csrf_token(): string { ensureSessionStarted(); if (!isset($_SESSION['_csrf_token']) || !is_string($_SESSION['_csrf_token'])) { $_SESSION['_csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['_csrf_token']; } function csrf_field(): string { return ''; } function verify_csrf_token(?string $token): bool { ensureSessionStarted(); if (!is_string($token) || $token === '') { return false; } $sessionToken = $_SESSION['_csrf_token'] ?? null; return is_string($sessionToken) && hash_equals($sessionToken, $token); }