PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]); } return self::$pdo; } public function query(string $sql, array $params = []): PDOStatement { $stmt = self::get()->prepare($sql); $stmt->execute($params); return $stmt; } public function fetch(string $sql, array $params = []): ?array { $row = $this->query($sql, $params)->fetch(); return $row ?: null; } public function fetchAll(string $sql, array $params = []): array { return $this->query($sql, $params)->fetchAll(); } public function insert(string $table, array $data) { $columns = implode(', ', array_keys($data)); $placeholders = ':' . implode(', :', array_keys($data)); $this->query("INSERT INTO {$table} ({$columns}) VALUES ({$placeholders})", $data); return self::get()->lastInsertId(); } public function update(string $table, array $data, string $where, array $whereParams = []) { $set = []; foreach (array_keys($data) as $column) { $set[] = "{$column} = :{$column}"; } $sql = "UPDATE {$table} SET " . implode(', ', $set) . " WHERE {$where}"; return $this->query($sql, array_merge($data, $whereParams))->rowCount(); } } function db(): Database { static $instance = null; if ($instance === null) { $instance = new Database(); } return $instance; }