20250820 v1.0.2-b2

This commit is contained in:
2025-08-20 18:09:37 +03:00
parent cc3b1ef41b
commit 95aa7d9411
22 changed files with 594 additions and 68 deletions

View File

@@ -13,7 +13,7 @@
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @version 1.0.2
* @since 1.0
*/
final class Condition implements IArrayable

View File

@@ -15,7 +15,7 @@
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @version 1.0.2
* @since 1.0
*/
final class ConditionBuilder implements IArrayable

View File

@@ -16,7 +16,7 @@
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @version 1.0.2
* @since 1.0
*/
final class ConditionGroup implements IArrayable

View File

@@ -10,7 +10,7 @@
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @version 1.0.2
* @since 1.0
* @see \PDO
*/

View File

@@ -36,7 +36,7 @@
* @var string $sql_where Строка WHERE условий.
* @var array $params Параметры условий.
*/
[$sql_where, $params] = $where->Build();
[$sql_where, $params] = $where->Build($this->Config->Driver);
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);

View File

@@ -29,16 +29,19 @@
*/
public function Delete (string $table, ConditionBuilder $where = new ConditionBuilder()): bool
{
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);
/**
* Получаю SQL-запрос и параметры для where.
*
* @var string $sql_where SQL-запрос для where.
* @var array $params Параметры запроса.
*/
[$sql_where, $params] = $where->Build();
[$sql_where, $params] = $where->Build($this->Config->Driver);
// Создаю запрос
$sql = "DELETE FROM $this->DBSignOpen$table$this->DBSignClose";
$sql = "DELETE FROM $table";
// Если заданы where-параметры
if ($where->Count() > 0)

View File

@@ -7,6 +7,7 @@
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBOperation;
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
use PDO;
@@ -33,22 +34,22 @@
* @return IDBItem|false Заполненный объект класса или <code>false</code> в случае ошибки.
*/
public function GetRow (string $table, array $columns = [], ConditionBuilder $where = new ConditionBuilder(),
string $className = "\\StdClass"): IDBItem|false
string $className = "\\StdClass"): IDBItem | false
{
// Задаю массив параметров
$params = [];
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);
// Формируем SQL-запрос
$sql = $this->PrepareSQLForRowsQuery($table, $columns, $where, $params);
// Добавляю лимит
$sql .= " LIMIT 1";
// Получаю строку
$row = $this->Query($sql, $params);
$row = $this->QueryFirst($sql, $params);
// Если не получено
if ($row === false)
if ($row === false || count($row) == 0)
// - то вывожу false
return false;
@@ -75,11 +76,14 @@
* @return false|ObjectArray Массив найденных классов или <code>false</code> в случае ошибки.
*/
public function GetRows (string $table, array $columns = [], ConditionBuilder $where = new ConditionBuilder(),
string $className = "\\StdClass"): false|ObjectArray
string $className = "\\StdClass"): false | ObjectArray
{
// Задаю массив параметров
$params = [];
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);
// Получаю SQL запрос
$sql = $this->PrepareSQLForRowsQuery($table, $columns, $where, $params);
@@ -124,18 +128,23 @@
* @see Query
*/
public function GetCol (string $table, string $column, ConditionBuilder $where = new ConditionBuilder()):
false|array
{
false | array {
/**
* Интерпретирую условия.
*
* @var string $sql_where Строка запроса.
* @var array $params Массив параметров строки запроса.
*/
[$sql_where, $params] = $where->Build();
[$sql_where, $params] = $where->Build($this->Config->Driver);
// Получаю знаки открытия параметра и закрытия его
[$signOpen, $signClose] = DBDriver::GetSigns($this->Config->Driver);
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);
// Создаю запрос
$sql = "SELECT $this->DBSignOpen$column$this->DBSignClose FROM $this->DBSignOpen$table$this->DBSignClose";
$sql = "SELECT $signOpen$column$signClose FROM $table";
// Если заданы where-параметры
if ($where->Count() > 0)

View File

@@ -119,6 +119,9 @@
// Подготавливаю массив параметров
$params = [];
// Получаю знаки открытия параметра и закрытия его
[$signOpen, $signClose] = DBDriver::GetSigns($this->Config->Driver);
// Получаю массив свойств
$properties = self::GetProperties($row, DBOperation::Insert);
@@ -157,7 +160,7 @@
$keyReal = $key[0] == ":" ? substr($key, 1) : $key;
// - добавляю в результирующий массив ключей
$keys_params[] = "$this->DBSignOpen$keyReal$this->DBSignClose";
$keys_params[] = "$signOpen$keyReal$signClose";
// - добавляю в результирующий массив значений
$keys_values[] = ":$keyReal";

View File

@@ -291,12 +291,12 @@
* @param string $className Имя класса объекта.
* @param DBOperation $operation Операция.
*
* @return object|null Экземпляр класса объекта или <code>null</code>, если ошибка.
* @return IDBItem|null Экземпляр класса объекта или <code>null</code>, если ошибка.
*/
private function RestoreItem (array $row, string $className, DBOperation $operation): ?object
private function RestoreItem (array $row, string $className, DBOperation $operation): ?IDBItem
{
// Если целевой класс не реализует интерфейс IDBItem
if (in_array(IDBItem::class, class_implements($className)))
if (!is_a($className, IDBItem::class, true))
// - то прерываем и возвращаем null
return null;
@@ -385,8 +385,12 @@
*/
private function PrepareColumn (array $columns): array
{
// Получаю знаки открытия параметра и закрытия его
[$signOpen, $signClose] = DBDriver::GetSigns($this->Config->Driver);
// Возвращаю результат
return array_map(
function ($item)
function ($item) use ($signOpen, $signClose)
{
// Результирующая строка
$result = "";
@@ -399,18 +403,18 @@
// - последний символ
$lastLetter = substr($item, -1);
// - если первый символ не $this->DBSignOpen
if ($firstLetter !== $this->DBSignOpen)
// - если первый символ не $signOpen
if ($firstLetter !== $signOpen)
// -- то добавляем
$result .= $this->DBSignOpen;
$result .= $signOpen;
// - добавляем строку
$result .= $item;
// - если последний символ не $this->DBSignClose
if ($lastLetter !== $this->DBSignClose)
// - если последний символ не $signClose
if ($lastLetter !== $signClose)
// -- то добавляем
$result .= $this->DBSignClose;
$result .= $signClose;
}
// Возвращаем результат
@@ -438,13 +442,13 @@
* @var string $sql_where where-запрос SQL
* @var array $params Параметры и их значения (для защиты от SQL-инъекции)
*/
[$sql_where, $params] = $whereConditions->Build();
[$sql_where, $params] = $whereConditions->Build($this->Config->Driver);
// Колонки
$sql_columns = count($columns) > 0 ? implode(', ', $this->PrepareColumn($columns)) : "*";
// Создаю запрос
$sql = "SELECT $sql_columns FROM $this->DBSignOpen$table$this->DBSignClose";
$sql = "SELECT $sql_columns FROM $table";
// Если заданы where-параметры
if ($whereConditions->Count() > 0)
@@ -464,9 +468,13 @@
*/
private function PrepareTableName (string $table): string
{
// Получаю знаки открытия параметра и закрытия его
[$signOpen, $signClose] = DBDriver::GetSigns($this->Config->Driver);
// Возвращаю результат
return match ($this->Config->Driver) {
DBDriver::MySQL, DBDriver::SQLite, DBDriver::OracleDB, DBDriver::PostgreSQL => $this->DBSignOpen
. $table . $this->DBSignClose,
DBDriver::MySQL, DBDriver::SQLite, DBDriver::OracleDB, DBDriver::PostgreSQL =>
"$signOpen$table$signClose",
DBDriver::MSSQL => "[dbo].[$table]"
};
}

View File

@@ -135,8 +135,11 @@
// - то возвращаем true
return true;
// Обрабатываю имя таблицы
$tableName = $this->PrepareTableName($tableName);
// SQL-запрос
$sql = "DROP TABLE dbo.`$tableName`";
$sql = "DROP TABLE $tableName";
// Инициализирую транзакцию
$this->InitTransaction();
@@ -169,6 +172,6 @@
}
// Возвращаю, существует ли теперь таблица
return $this->IsTableExist($tableName);
return !$this->IsTableExist($tableName);
}
}

View File

@@ -7,6 +7,7 @@
use Exception;
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
use goodboyalex\php_db_components_pack\enums\DBDriver;
use goodboyalex\php_db_components_pack\enums\DBOperation;
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
use goodboyalex\php_db_components_pack\models\DBItemProperty;
@@ -33,6 +34,9 @@
*/
public function Update (string $table, IDBItem $item): bool
{
// Получаю знаки открытия параметра и закрытия его
[$signOpen, $signClose] = DBDriver::GetSigns($this->Config->Driver);
// Получаю свойства объекта
$properties = self::GetProperties($item, DBOperation::Update);
@@ -124,14 +128,19 @@
// Для каждого свойства для обновления
foreach ($propertyToSet as $key => $value) {
// - добавляю его в массив set
$set[] = "$this->DBSignOpen$key$this->DBSignClose=:$key";
$set[] = "$key=:$key";//"$signOpen$key$signClose=:$key";
// - добавляю его в массив параметров set для обновления
$set_params[":$key"] = $value;
}
// Строковая интерпретация массива set
$sql_set = count($set) > 0 ? '(' . implode(", ", $set) . ')' : "";
// Если нечего изменять
if (count($set) == 0)
// - то прерываем с успехом
return true;
// Устанавливаю параметры обновления
$sql_set = implode(", ", $set);
/**
* Получаю WHERE-запрос и параметры.
@@ -139,13 +148,16 @@
* @var string $sql_where WHERE-запрос.
* @var array $where_params Параметры WHERE-запроса.
*/
[$sql_where, $where_params] = $where->Build();
[$sql_where, $where_params] = $where->Build($this->Config->Driver);
// Объединяю все параметры в один массив
$params = array_merge($set_params, $where_params);
// Подготавливаю имя таблицы
$table = $this->PrepareTableName($table);
// Создаю запрос
$sql = "UPDATE $this->DBSignOpen$table$this->DBSignClose SET $sql_set";
$sql = "UPDATE $table SET $sql_set";
// Если заданы where-параметры
if ($where->Count() > 0)