PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } catch (PDOException $e) { throw new \RuntimeException("Database connection failed: " . $e->getMessage()); } } return self::$instance; } public static function disconnect(): void { self::$instance = null; } public static function runMigrations(string $migrationsPath): void { $db = self::connect(); $files = glob($migrationsPath . '/*.sql'); sort($files); foreach ($files as $file) { echo "Running migration: " . basename($file) . "\n"; $sql = file_get_contents($file); try { $db->exec($sql); echo "✓ Migration completed successfully\n"; } catch (PDOException $e) { echo "✗ Migration failed: " . $e->getMessage() . "\n"; throw $e; } } echo "\nAll migrations completed!\n"; } }