182 lines
7.1 KiB
PHP
182 lines
7.1 KiB
PHP
<?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;
|
||
}
|
||
} |