⚠️ Database Driver Ontbreekt

De extensie pdo_mysql is niet actief in deze PHP-omgeving.

"); } $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_TIMEOUT => 5, ]; if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) { $options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = true; } $dsnWithDb = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s', DB_HOST, DB_PORT, DB_NAME, DB_CHARSET ); // 2. CHECK: Bestaat de database al? try { $pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options); ensure_tables_exist($pdo); return $pdo; } catch (PDOException $e) { error_log("MariaDB Verbindingsfout [{$e->getCode()}]: {$e->getMessage()}"); // Foutcode 1049 betekent: Database 'DB_NAME' bestaat nog NIET op de MariaDB server if ($e->getCode() == 1049 || str_contains($e->getMessage(), 'Unknown database')) { try { $serverDsn = sprintf('mysql:host=%s;port=%s;charset=%s', DB_HOST, DB_PORT, DB_CHARSET); $serverPdo = new PDO($serverDsn, DB_USER, DB_PASS, $options); $serverPdo->exec(sprintf( 'CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci', DB_NAME )); $pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options); ensure_tables_exist($pdo); return $pdo; } catch (PDOException $createEx) { error_log("Kan database " . DB_NAME . " niet automatisch aanmaken: " . $createEx->getMessage()); } } // Pen Test beveiliging: in live omgeving geen interne IP's of database-details tonen! if (defined('APP_ENV') && APP_ENV === 'live') { die("
⚠️

Database Tijdelijk Niet Bereikbaar

Er kon geen veilige verbinding tot stand worden gebracht met de database. Probeer het over enkele ogenblikken opnieuw.

"); } else { die("

MariaDB Verbindingsfout (" . htmlspecialchars((string)$e->getCode()) . ")

" . htmlspecialchars($e->getMessage()) . "

Host: " . htmlspecialchars(DB_HOST) . "
Poort: " . htmlspecialchars(DB_PORT) . "
Database: " . htmlspecialchars(DB_NAME) . "
Gebruiker: " . htmlspecialchars(DB_USER) . "
"); } } } /** * Zorgt ervoor dat ALLE benodigde tabellen en kolommen uit schema.sql aanwezig zijn in MariaDB * Voert elke tabel individueel uit zodat ontbrekende tabellen direct aangemaakt worden. */ function ensure_tables_exist(PDO $pdo): void { static $tablesChecked = false; if ($tablesChecked) return; $tablesChecked = true; try { $schemaFile = file_exists(__DIR__ . '/schema.sql') ? (__DIR__ . '/schema.sql') : (__DIR__ . '/../schema.sql'); if (file_exists($schemaFile)) { $sql = file_get_contents($schemaFile); $statements = array_filter(array_map('trim', explode(';', $sql))); foreach ($statements as $stmt) { $stmtClean = preg_replace('/^--.*$/m', '', $stmt); $stmtClean = trim($stmtClean); if (!empty($stmtClean)) { try { $pdo->exec($stmtClean); } catch (Throwable $t) { // Stil negeren indien tabel of relatie al bestaat } } } } // Zorg ervoor dat alle kolommen en upgrades aanwezig zijn $colUpgrades = [ "ALTER TABLE tasks MODIFY external_id VARCHAR(255) NULL", "ALTER TABLE tasks ADD COLUMN external_url TEXT NULL AFTER external_id", "ALTER TABLE users ADD COLUMN remember_token VARCHAR(64) NULL AFTER backup_codes", "ALTER TABLE users ADD COLUMN remember_token_expires_at DATETIME NULL AFTER remember_token", "ALTER TABLE users ADD COLUMN notification_settings TEXT NULL AFTER remember_token_expires_at", "ALTER TABLE users ADD COLUMN theme VARCHAR(20) NOT NULL DEFAULT 'dark' AFTER notification_settings", "ALTER TABLE users ADD COLUMN avatar_url VARCHAR(255) NULL AFTER theme", "ALTER TABLE users ADD COLUMN backup_codes TEXT NULL AFTER two_factor_enabled", ]; foreach ($colUpgrades as $sql) { try { $pdo->exec($sql); } catch (Throwable $t) { // Stil negeren indien kolom al bestaat } } } catch (Throwable $e) { error_log("Fout bij controleren tabellen: " . $e->getMessage()); } }