connection = new \PDO($dsn, $config['username'], $config['password']); $this->connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); $this->connection->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC); $this->connection->exec("SET NAMES 'utf8'"); } catch (\PDOException $e) { throw new \Exception("Ошибка подключения к базе данных: " . $e->getMessage()); } } public static function getInstance(): self { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } public function getConnection(): \PDO { return $this->connection; } /** * Выполнить SELECT запрос */ public function query(string $sql, array $params = []): array { $stmt = $this->connection->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(); } /** * Выполнить SELECT запрос и получить одну запись */ public function queryOne(string $sql, array $params = []): ?array { $stmt = $this->connection->prepare($sql); $stmt->execute($params); $result = $stmt->fetch(); return $result ?: null; } /** * Выполнить INSERT/UPDATE/DELETE запрос */ public function execute(string $sql, array $params = []): bool { $stmt = $this->connection->prepare($sql); return $stmt->execute($params); } /** * Получить ID последней вставленной записи */ public function lastInsertId(): string { return $this->connection->lastInsertId(); } /** * Начать транзакцию */ public function beginTransaction(): bool { return $this->connection->beginTransaction(); } /** * Подтвердить транзакцию */ public function commit(): bool { return $this->connection->commit(); } /** * Откатить транзакцию */ public function rollBack(): bool { return $this->connection->rollBack(); } // Запрещаем клонирование и десериализацию private function __clone() {} public function __wakeup() { throw new \Exception("Десериализация Singleton запрещена"); } }