false в случае ошибки. */ public function Query (string $query, array $params = []): array|false { // Проверяем, что это именно запрос SELECT if (!preg_match('/^\s*SELECT\s+/i', trim($query))) { $this->HandleException(new Exception("Некорректный запрос для метода Query() / Incorrect request for the Query() method: '$query'. Используйте метод Execute() для небезопасных операций / Use the Execute() method for unsafe operations."), false); return false; } // Подготавливаем запрос $stmt = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]); // Если запрос не подготовлен if ($stmt === false) { // - обрабатываю ошибку $this->HandleException(new Exception("Ошибка подготовки SQL-запроса / SQL query preparation error"), false); // - прерываю выполнение return false; } try { // Выполняем запрос $stmt->execute($params); } catch (PDOException $e) { // - в случае ошибки, обрабатываю её $this->HandleException(new Exception("Ошибка выполнения SQL-запроса / SQL query execution error: " . $e->getMessage()), false); // - прерываю выполнение return false; } // Если получены данные, то возвращаю их, в противном случае возвращаю пустой массив return ($data = $stmt->fetchAll(PDO::FETCH_ASSOC)) !== [] ? $data : []; } /** * Получить первую строку результата запроса. * * @param string $query Запрос SQL. * @param array $params Параметры запроса. * * @return array|false Первая строка результата запроса или false в случае ошибки. */ public function QueryFirst (string $query, array $params = []): array|false { // Выполняем запрос $rows = $this->Query($query, $params); // Если получены данные, то возвращаю первую строку, в противном случае возвращаю false return is_array($rows) ? reset($rows) : false; } /** * Получить последнюю строку результата запроса. * * @param string $query Запрос SQL. * @param array $params Параметры запроса. * * @return array|false Последняя строка результата запроса или false в случае ошибки. */ public function QueryLast (string $query, array $params = []): array|false { // Выполняем запрос $rows = $this->Query($query, $params); // Если получены данные, то возвращаю последнюю строку, в противном случае возвращаю false return is_array($rows) ? end($rows) : false; } /** * Выполнить запрос, который изменяет данные в базе данных (INSERT, UPDATE, DELETE). * * @param string $query Запрос SQL. * @param array $params Параметры запроса. * * @return int|false Количество затронутых строк или false в случае ошибки. */ public function Execute (string $query, array $params = []): int|false { // Проверяем, что это не запрос SELECT if (preg_match('/^\s*SELECT\s+/i', trim($query))) { // - выдаю ошибку $this->HandleException(new Exception("Некорректный запрос для метода Execute() / Incorrect request for the Execute() method: '$query'. Используйте метод Query() для безопасного выбора данных / Use the Query() method to select data safely."), false); // - аннулирую результат return false; } try { // Если это простой запрос без параметров if (empty($params)) // - то просто выполняю его return $this->DataBaseHandle->exec($query); else { // - в противном случае, подготавливаем запрос с параметрами $stmt = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]); // - если подготовили неуспешно if (!$stmt) { // -- то формируем ошибку $this->HandleException(new PDOException("Ошибка подготовки SQL-запроса / SQL query preparation error"), false); // -- возвращаем неудачу return false; } // - выполняем запрос $executed = $stmt->execute($params); // - если успешно, то возвращаем количество изменённых строк, иначе - false return ($executed) ? $stmt->rowCount() : false; } } catch (PDOException $e) { // - в случае ошибки, обрабатываю её $this->HandleException($e, false); // - прерываю выполнение return false; } } }