From 5a5456ffe016f3f6d1200835d9c58b185544976e Mon Sep 17 00:00:00 2001
From: Niek Rabelink
| Tijdstip | +Tijdstip (NL) | Gebruiker / Doel | Actie | IP-adres | diff --git a/config/database.php b/config/database.php index f26f03a..ac3bed4 100644 --- a/config/database.php +++ b/config/database.php @@ -32,6 +32,7 @@ function get_db_connection(): PDO { "); } + $tzOffset = date('P'); // Dynamische offset conform Europe/Amsterdam (+02:00 in zomertijd, +01:00 in wintertijd) $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, @@ -41,6 +42,9 @@ function get_db_connection(): PDO { if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) { $options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = true; } + if (defined('PDO::MYSQL_ATTR_INIT_COMMAND')) { + $options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET time_zone = '{$tzOffset}'"; + } $dsnWithDb = sprintf( 'mysql:host=%s;port=%s;dbname=%s;charset=%s', @@ -53,6 +57,8 @@ function get_db_connection(): PDO { // 2. CHECK: Bestaat de database al? try { $pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options); + // Garandeer dat MariaDB sessietijd 1-op-1 synchroon loopt met PHP tijd (Europe/Amsterdam) + $pdo->exec("SET time_zone = '{$tzOffset}'"); ensure_tables_exist($pdo); return $pdo; @@ -70,6 +76,7 @@ function get_db_connection(): PDO { )); $pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options); + $pdo->exec("SET time_zone = '{$tzOffset}'"); ensure_tables_exist($pdo); return $pdo; @@ -228,8 +235,21 @@ function ensure_tables_exist(PDO $pdo): void { } } } + // Zorg dat eerdere audit logs die in UTC (+00:00) zijn weggeschreven worden gesynchroniseerd naar Europe/Amsterdam (+2 uur) + try { + $stmtCheck = $pdo->query("SELECT setting_value FROM system_settings WHERE setting_key = 'audit_logs_tz_fixed' LIMIT 1"); + $fixed = $stmtCheck ? $stmtCheck->fetchColumn() : null; + if (!$fixed) { + // Pas bestaande audit logs eenmalig aan zodat de weergave klopt met de lokale tijd + $pdo->exec("UPDATE audit_logs SET created_at = DATE_ADD(created_at, INTERVAL 2 HOUR)"); + $pdo->prepare(" + INSERT INTO system_settings (setting_key, setting_value, created_at, updated_at) + VALUES ('audit_logs_tz_fixed', '1', NOW(), NOW()) + ON DUPLICATE KEY UPDATE setting_value = '1', updated_at = NOW() + ")->execute(); + } } catch (Throwable $e) { - // Stil negeren indien tabellen nog in opbouw zijn + // Stil negeren indien system_settings tabel nog niet bestaat } } catch (Throwable $e) { error_log("Fout bij controleren tabellen: " . $e->getMessage()); diff --git a/includes/auth.php b/includes/auth.php index 47a4423..f80565a 100644 --- a/includes/auth.php +++ b/includes/auth.php @@ -112,9 +112,10 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = '' $statusNormalized = 'SUCCESS'; } + $createdAt = date('Y-m-d H:i:s'); $stmt = $db->prepare(" INSERT INTO audit_logs (user_id, user_email, action, resource_type, resource_id, details, ip_address, user_agent, status, created_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW()) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([ $userId ?: null, @@ -125,7 +126,8 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = '' $detailsJson, $ip, $ua, - $statusNormalized + $statusNormalized, + $createdAt ]); } catch (Throwable $e) { // Audit log mag NOOIT de applicatiewerking breken
|---|