This commit is contained in:
2025-08-02 15:45:51 +03:00
parent 906ed15c58
commit 4ec8ccc089
8 changed files with 731 additions and 536 deletions

View File

@@ -194,9 +194,10 @@
}
/**
* Собирает условие в виде строки.
* Собирает условие в виде пригодном для SQL. Также возвращает массив параметров защиты от SQL-инъекций.
*
* @return string Возвращает условие в виде, пригодном для SQL.
* @return Tuple (string, array) Возвращает условие в виде, пригодном для SQL и массив параметров для защиты от
* SQL-инъекций.
*/
public function Build (): Tuple
{

View File

@@ -9,11 +9,13 @@
use Closure;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\models\DBConfig;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseCountExist;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseGet;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseInsert;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseQueryExecute;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseSpecial;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseTransactions;
use goodboyalex\php_db_components_pack\traits\Database\DatabaseUpdate;
use PDO;
use PDOException;
@@ -23,7 +25,7 @@
* Используется класс PDO для подключения к базе данных.
*
* @author Александр Бабаев
* @package php_components_pack
* @package php_db_components_pack
* @version 1.0
* @since 1.0
* @see PDO
@@ -47,7 +49,9 @@
private string $DBSignClose;
/**
* @var Closure $OnException Обработчик исключений.
* @var Closure $OnException Обработчик исключений. Анонимная функция формата:
*
* function (Exception $e, bool $isTerminate): void
*/
private Closure $OnException;
@@ -57,10 +61,12 @@
private DBConfig $Config;
/**
* Конструктор. Подключает базу данных
* Конструктор.
*
* @param DBConfig $config Конфигурация подключения к базе данных.
* @param callable $onException Обработчик исключений.
* @param callable $onException Обработчик исключений. Анонимная функция формата:
*
* function (Exception $e, bool $isTerminate): void
*/
public function __construct (DBConfig $config, callable $onException)
{
@@ -126,40 +132,6 @@
$this->DataBaseHandle = null;
}
/**
* Получает набор строк в массиве данных, удовлетворяющий выборке
*
* @param string $table Имя таблицы
* @param array $columns Колонки, которые нужно включить в запрос
* @param array $where Параметры выборки
*
* @return false|array Строка в формате массива или false в случае ошибки
*
* @see Query
* @see QueryFirst
* @see QueryLast
* @see GetRow
*/
public function GetRows (string $table, array $columns = [], array $where = []): false|array
{
// Задаю массив параметров
$params = [];
// Получаю SQL запрос
$sql = $this->PrepareSQLForRowsQuery($table, $columns, $where, $params);
// Получаю строки на основании запроса
$queryResult = $this->Query($sql, $params);
// Если строки не получены
if ($queryResult === false)
// - то выдаю ошибку
return false;
// Получаю значение строк
return $queryResult;
}
// Транзакции
use DatabaseTransactions;
@@ -172,220 +144,15 @@
// Получение данных
use DatabaseGet;
// Проверка существования и получение количества строк
use DatabaseCountExist;
// Обновление записей
use DatabaseUpdate;
// Приватные методы
use DatabaseSpecial;
/**
* Получает колонку в массиве данных
*
* @param string $table Имя таблицы
* @param string $column Имя колонки
* @param array $where Параметры запроса
*
* @return false|array Ассоциированный массив с результатом запроса или false в случае ошибки
*
* @see Query
*/
public function GetCol (string $table, string $column, array $where = []): false|array
{
// Задаю параметры
$params = [];
// Строковая интерпретация массива условий
$sql_where = $this->PrepareQueryWhere($where, $params);
// Создаю запрос
$sql = "SELECT $this->DBSignOpen$column$this->DBSignClose FROM $this->DBSignOpen$table$this->DBSignClose";
// Если заданы where-параметры
if (count($where) > 0) {
// - то добавляю их
$sql .= " WHERE $sql_where";
}
// Получаю столбец на основании запроса
$queryResult = $this->Query($sql, $params);
// Если строка не получена или пуста
if ($queryResult === false)
// - то выдаю ошибку
return false;
// Создаю результат
$result = [];
// Для каждого результата запроса
foreach ($queryResult as $row)
// - передаю его в результат
$result[] = $row[$column];
// Вывожу результат
return $result;
}
/**
* Получение значение единичного поля
*
* @param string $table Имя таблицы
* @param string $column Требуемый столбец
* @param array $where Параметры запроса
*
* @return mixed|null Результат запроса или null в случае ошибки
*/
public function GetValue (string $table, string $column, array $where = []): mixed
{
// Задаю параметры
$params = [];
// Строковая интерпретация массива условий
$sql_where = $this->PrepareQueryWhere($where, $params);
// Создаю запрос
$sql = "SELECT $this->DBSignOpen$column$this->DBSignClose FROM $this->DBSignOpen$table$this->DBSignClose";
// Если заданы where-параметры
if (count($where) > 0) {
// - то добавляю их
$sql .= " WHERE $sql_where";
}
// Получаю строку на основании запроса
$queryResult = $this->QueryScalar($sql, $params);
// Если строка не получена или пуста
if ($queryResult === false || count($queryResult) == 0)
// - то выдаю результат null
return null;
// Получаю значение колонки
return $queryResult[$column];
}
/**
* Заменяет данные в строке базы данных
*
* @param string $table Имя таблицы
* @param array $set Массив данных для замены
* @param array $where Массив условий
*
* @return bool Результат выполнения
*/
public function Update (string $table, array $set, array $where = []): bool
{
// Создаю массив параметров
$params_set = [];
// Строковая интерпретация массива для изменения
$sql_set = "";
// Для каждых данных для изменения
foreach ($set as $key => $value) {
// - получаю ключ 100%-но без ":" в начале
$set_key = $key[0] == ":" ? substr($key, 1) : $key;
// - добавляю префикс для 2 или более итерации
$prefix = $sql_set == "" ? "" : ", ";
// - добавляю данные в sql_set
$sql_set .= "$prefix$this->DBSignOpen$set_key$this->DBSignClose=:$set_key";
// - добавляю данные в параметры
$params_set[":" . $set_key] = $value;
}
// Обработанные параметры
$params_where = [];
// Строковая интерпретация массива условий
$sql_where = $this->PrepareQueryWhere(where: $where, params: $params_where);
// Создаю параметры
$params = array_merge($params_set, $params_where);
// Создаю запрос
$sql = "UPDATE $this->DBSignOpen$table$this->DBSignClose SET $sql_set";
// Если заданы where-параметры
if (count($where) > 0)
// - то добавляю их
$sql .= " WHERE $sql_where";
// Выполняю запрос
$count = $this->Execute($sql, $params);
// Если результат - false
if ($count === false)
// - то и общий результат - false
return false;
// Если изменено 0 строк
if ($count === 0)
// - то и общий результат - false
return false;
// Вывожу результат -- успех
return true;
}
/**
* Проверяет, существует ли запись в таблице.
*
* @param string $table Имя таблицы
* @param array $where Массив условий
*
* @return bool Результат проверки
*/
public function IsExist (string $table, array $where = []): bool
{
// Вывожу результат
return $this->Count($table, $where) > 0;
}
/**
* Подсчитывает количество строк, удовлетворяющих условию.
*
* @param string $table Имя таблицы
* @param array $where Массив условий выборки
*
* @return int Количество строк или -1, в случае ошибки
*/
public function Count (string $table, array $where = []): int
{
// Параметры
$params = [];
// Строковая интерпретация массива условий
$sql_where = $this->PrepareQueryWhere($where, $params);
// Создаю запрос
$sql = "SELECT COUNT(*) FROM $this->DBSignOpen$table$this->DBSignClose";
// Если заданы where-параметры
if (count($where) > 0) {
// - то добавляю их
$sql .= ' WHERE ' . $sql_where;
}
// Выполняю запрос
$countResult = $this->Query($sql, $params);
// Если запрос выполнен с ошибкой
if ($countResult === false)
// - то в результат идёт -1
return -1;
// Получаю секцию
$section = match ($this->Config->Driver) {
DBDriver::MySQL, DBDriver::SQLite => "COUNT(*)",
DBDriver::MSSQL, DBDriver::OracleDB, DBDriver::PostgreSQL => ""
};
// Вывожу количество
return isset($countResult[0][$section]) ? (int)$countResult[0][$section] : -1;
}
/**
* Удаляет строки по условию.
*