20250820 v1.0.2-b2
This commit is contained in:
@@ -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
|
||||
|
@@ -15,7 +15,7 @@
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @version 1.0.2
|
||||
* @since 1.0
|
||||
*/
|
||||
final class ConditionBuilder implements IArrayable
|
||||
|
@@ -16,7 +16,7 @@
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @version 1.0.2
|
||||
* @since 1.0
|
||||
*/
|
||||
final class ConditionGroup implements IArrayable
|
||||
|
@@ -10,7 +10,7 @@
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_db_components_pack
|
||||
* @version 1.0
|
||||
* @version 1.0.2
|
||||
* @since 1.0
|
||||
* @see \PDO
|
||||
*/
|
||||
|
@@ -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);
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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";
|
||||
|
@@ -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]"
|
||||
};
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user