php_db_components_pack/sources/traits/Database/DatabaseQueryExecute.php
2025-07-29 17:50:57 +03:00

182 lines
7.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* @noinspection SqlNoDataSourceInspection
*/
namespace goodboyalex\php_db_components_pack\traits\Database;
use PDO;
use PDOException;
/**
* Трейт для работы с запросами к базе данных типа Query и Execute.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
* @see PDO
*/
trait DatabaseQueryExecute
{
/**
* Запрос строк из базы данных.
*
* @param string $query Запрос
* @param array $params Параметры запроса
*
* @return false|array Ассоциированный массив с результатом запроса или false в случае ошибки
*/
public function Query (string $query, array $params = []): false|array
{
// По умолчанию, результат пуст
$result = false;
try {
// Подготавливаю запрос
$STH = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
// Выполняю запрос
$STH->execute($params);
// Указываю, что данные, которые я хочу получить, должны быть в ассоциативном массиве
$STH->setFetchMode(PDO::FETCH_ASSOC);
// Получаю все данные
$result = $STH->fetchAll();
}
catch (PDOException $e) {
$this->HandleException($e);
}
// Вывожу результат
return $result;
}
/**
* Выполняем запрос на получение одной строки (аналог QueryFirst)
*
* @param string $query Запрос
* @param array $params Параметры запроса
*
* @return false|array Строка в формате массива или false в случае ошибки
*
* @see Query
* @see QueryFirst
* @see QueryLast
* @see GetRow
*/
public function QueryScalar (string $query, array $params = []): false|array
{
return $this->QueryFirst($query, $params);
}
/**
* Выполняем запрос на получение первой строки
*
* @param string $query Запрос
* @param array $params Параметры запроса
*
* @return false|array Строка в формате массива или false в случае ошибки
*
* @see Query
* @see QueryLast
* @see QueryScalar
*/
public function QueryFirst (string $query, array $params = []): false|array
{
// Выполняю запрос
$result = $this->Query($query, $params);
// Если в результате запроса получили ошибку или количество строк = 0
if ($result === false || count($result) == 0)
// - то возвращаем ошибку
return false;
// Получаю первый ключ массива
$firstKey = array_key_first($result);
// Возвращаем первую строку
return $result[$firstKey];
}
/**
* Выполняем запрос на получение последней строки
*
* @param string $query Запрос
* @param array $params Параметры запроса
*
* @return false|array Строка в формате массива или false в случае ошибки
*
* @see Query
* @see QueryFirst
* @see QueryScalar
*/
public function QueryLast (string $query, array $params = []): false|array
{
// Выполняю запрос
$result = $this->Query($query, $params);
// Если в результате запроса получили ошибку или количество строк = 0
if ($result === false || count($result) == 0)
// - то возвращаем ошибку
return false;
// Получаю последний ключ массива
$lastKey = array_key_last($result);
// Возвращаем первую строку
return $result[$lastKey];
}
/**
* Выполнение запроса. Обычно используется для операций,
* которые не возвращают никаких данных, кроме количества
* затронутых ими записей. Например,
*
* <code>$db->Execute('DELETE FROM table WHERE id=1');</code>
*
* @param string $query Запрос
* @param array $params Параметры запроса
*
* @return int|false Количество затронутых строк или false в случае ошибки
*/
public function Execute (string $query, array $params = []): int|false
{
// По умолчанию результат false
$result = false;
try {
// Если параметры не заданы
if (count($params) == 0) {
// - то выполняю запрос
$result = $this->DataBaseHandle->exec($query);
}
else {
// - в противном случае
// -- подготавливаю запрос
$STH = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
// -- выполняю запрос
$opResult = $STH->execute($params);
// -- и если выполнение успешное,
if ($opResult)
// --- то в результат пойдёт количество строк
$result = $STH->rowCount();
}
}
catch (PDOException $e) {
$this->HandleException($e);
}
// Если в результате false
if ($result === false)
// - то возвращаю его
return false;
// Возвращаю результат
return $result;
}
}