20250802
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
namespace goodboyalex\php_db_components_pack\traits\Database;
|
||||
|
||||
use Exception;
|
||||
use PDO;
|
||||
use PDOException;
|
||||
|
||||
@@ -13,7 +14,7 @@
|
||||
* Трейт для работы с запросами к базе данных типа Query и Execute.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @package php_db_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
* @see PDO
|
||||
@@ -21,162 +22,138 @@
|
||||
trait DatabaseQueryExecute
|
||||
{
|
||||
/**
|
||||
* Запрос строк из базы данных.
|
||||
* Выполнить запрос к базе данных и вернуть ассоциированный массив.
|
||||
*
|
||||
* @param string $query Запрос
|
||||
* @param array $params Параметры запроса
|
||||
* @param string $query Запрос SQL.
|
||||
* @param array $params Параметры запроса.
|
||||
*
|
||||
* @return false|array Ассоциированный массив с результатом запроса или false в случае ошибки
|
||||
* @return array|false Ассоциативный массив с результатом запроса или <code>false</code> в случае ошибки.
|
||||
*/
|
||||
public function Query (string $query, array $params = []): false|array
|
||||
public function Query (string $query, array $params = []): array|false
|
||||
{
|
||||
// По умолчанию, результат пуст
|
||||
$result = 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 {
|
||||
// Подготавливаю запрос
|
||||
$STH = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
|
||||
|
||||
// Выполняю запрос
|
||||
$STH->execute($params);
|
||||
|
||||
// Указываю, что данные, которые я хочу получить, должны быть в ассоциативном массиве
|
||||
$STH->setFetchMode(PDO::FETCH_ASSOC);
|
||||
|
||||
// Получаю все данные
|
||||
$result = $STH->fetchAll();
|
||||
// Выполняем запрос
|
||||
$stmt->execute($params);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this->HandleException($e);
|
||||
// - в случае ошибки, обрабатываю её
|
||||
$this->HandleException(new Exception("Ошибка выполнения SQL-запроса / SQL query execution error: " .
|
||||
$e->getMessage()), false);
|
||||
|
||||
// - прерываю выполнение
|
||||
return false;
|
||||
}
|
||||
|
||||
// Вывожу результат
|
||||
return $result;
|
||||
// Если получены данные, то возвращаю их, в противном случае возвращаю пустой массив
|
||||
return ($data = $stmt->fetchAll(PDO::FETCH_ASSOC)) !== [] ? $data : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Выполняем запрос на получение одной строки (аналог QueryFirst)
|
||||
* Получить первую строку результата запроса.
|
||||
*
|
||||
* @param string $query Запрос
|
||||
* @param array $params Параметры запроса
|
||||
* @param string $query Запрос SQL.
|
||||
* @param array $params Параметры запроса.
|
||||
*
|
||||
* @return false|array Строка в формате массива или false в случае ошибки
|
||||
*
|
||||
* @see Query
|
||||
* @see QueryFirst
|
||||
* @see QueryLast
|
||||
* @see GetRow
|
||||
* @return array|false Первая строка результата запроса или <code>false</code> в случае ошибки.
|
||||
*/
|
||||
public function QueryScalar (string $query, array $params = []): false|array
|
||||
public function QueryFirst (string $query, array $params = []): array|false
|
||||
{
|
||||
return $this->QueryFirst($query, $params);
|
||||
// Выполняем запрос
|
||||
$rows = $this->Query($query, $params);
|
||||
|
||||
// Если получены данные, то возвращаю первую строку, в противном случае возвращаю false
|
||||
return is_array($rows) ? reset($rows) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Выполняем запрос на получение первой строки
|
||||
* Получить последнюю строку результата запроса.
|
||||
*
|
||||
* @param string $query Запрос
|
||||
* @param array $params Параметры запроса
|
||||
* @param string $query Запрос SQL.
|
||||
* @param array $params Параметры запроса.
|
||||
*
|
||||
* @return false|array Строка в формате массива или false в случае ошибки
|
||||
*
|
||||
* @see Query
|
||||
* @see QueryLast
|
||||
* @see QueryScalar
|
||||
* @return array|false Последняя строка результата запроса или <code>false</code> в случае ошибки.
|
||||
*/
|
||||
public function QueryFirst (string $query, array $params = []): false|array
|
||||
public function QueryLast (string $query, array $params = []): array|false
|
||||
{
|
||||
// Выполняю запрос
|
||||
$result = $this->Query($query, $params);
|
||||
// Выполняем запрос
|
||||
$rows = $this->Query($query, $params);
|
||||
|
||||
// Если в результате запроса получили ошибку или количество строк = 0
|
||||
if ($result === false || count($result) == 0)
|
||||
// - то возвращаем ошибку
|
||||
return false;
|
||||
|
||||
// Получаю первый ключ массива
|
||||
$firstKey = array_key_first($result);
|
||||
|
||||
// Возвращаем первую строку
|
||||
return $result[$firstKey];
|
||||
// Если получены данные, то возвращаю последнюю строку, в противном случае возвращаю false
|
||||
return is_array($rows) ? end($rows) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Выполняем запрос на получение последней строки
|
||||
* Выполнить запрос, который изменяет данные в базе данных (INSERT, UPDATE, DELETE).
|
||||
*
|
||||
* @param string $query Запрос
|
||||
* @param array $params Параметры запроса
|
||||
* @param string $query Запрос SQL.
|
||||
* @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 в случае ошибки
|
||||
* @return int|false Количество затронутых строк или <code>false</code> в случае ошибки.
|
||||
*/
|
||||
public function Execute (string $query, array $params = []): int|false
|
||||
{
|
||||
// По умолчанию результат false
|
||||
$result = 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 (count($params) == 0) {
|
||||
// - то выполняю запрос
|
||||
$result = $this->DataBaseHandle->exec($query);
|
||||
}
|
||||
// Если это простой запрос без параметров
|
||||
if (empty($params))
|
||||
// - то просто выполняю его
|
||||
return $this->DataBaseHandle->exec($query);
|
||||
else {
|
||||
// - в противном случае
|
||||
// -- подготавливаю запрос
|
||||
$STH = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
|
||||
// - в противном случае, подготавливаем запрос с параметрами
|
||||
$stmt = $this->DataBaseHandle->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
|
||||
|
||||
// -- выполняю запрос
|
||||
$opResult = $STH->execute($params);
|
||||
// - если подготовили неуспешно
|
||||
if (!$stmt) {
|
||||
// -- то формируем ошибку
|
||||
$this->HandleException(new PDOException("Ошибка подготовки SQL-запроса / SQL query preparation error"),
|
||||
false);
|
||||
|
||||
// -- возвращаем неудачу
|
||||
return false;
|
||||
}
|
||||
|
||||
// -- и если выполнение успешное,
|
||||
if ($opResult)
|
||||
// --- то в результат пойдёт количество строк
|
||||
$result = $STH->rowCount();
|
||||
// - выполняем запрос
|
||||
$executed = $stmt->execute($params);
|
||||
|
||||
// - если успешно, то возвращаем количество изменённых строк, иначе - false
|
||||
return ($executed) ? $stmt->rowCount() : false;
|
||||
}
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this->HandleException($e);
|
||||
}
|
||||
|
||||
// Если в результате false
|
||||
if ($result === false)
|
||||
// - то возвращаю его
|
||||
// - в случае ошибки, обрабатываю её
|
||||
$this->HandleException($e, false);
|
||||
|
||||
// - прерываю выполнение
|
||||
return false;
|
||||
|
||||
// Возвращаю результат
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user