20250819
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
use goodboyalex\php_components_pack\classes\Tuple;
|
||||
use goodboyalex\php_components_pack\extensions\StringExtension;
|
||||
use goodboyalex\php_components_pack\interfaces\IArrayable;
|
||||
use goodboyalex\php_db_components_pack\enums\DBDriver;
|
||||
use PHPUnit\Event\InvalidArgumentException;
|
||||
|
||||
/**
|
||||
@@ -101,15 +102,19 @@
|
||||
/**
|
||||
* Формирует условие.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
* @param int $index Индекс замены параметров для защиты от SQL-инъекций.
|
||||
*
|
||||
* @return Tuple (string, array) Сформированное условие: SQL-запрос и параметры запроса.
|
||||
*/
|
||||
public function Get (int $index = 0): Tuple
|
||||
public function Get (DBDriver $driver, int $index = 0): Tuple
|
||||
{
|
||||
// Получаю знаки открытия и закрытия
|
||||
[$signOpen, $signClose] = $driver->GetSigns($driver);
|
||||
|
||||
// Начинаю формировать SQL
|
||||
$sql = (!str_starts_with($this->ColumnName, "FUNC:"))
|
||||
? "`$this->ColumnName`"
|
||||
? "$signOpen$this->ColumnName$signClose"
|
||||
: StringExtension::Replace('FUNC:', '', $this->ColumnName);
|
||||
|
||||
// Добавляю оператор
|
||||
|
@@ -5,6 +5,7 @@
|
||||
use goodboyalex\php_components_pack\classes\Tuple;
|
||||
use goodboyalex\php_components_pack\extensions\ArrayExtension;
|
||||
use goodboyalex\php_components_pack\interfaces\IArrayable;
|
||||
use goodboyalex\php_db_components_pack\enums\DBDriver;
|
||||
use goodboyalex\php_db_components_pack\traits\ConditionBuilder\ConditionBuilderConditionsSet;
|
||||
use goodboyalex\php_db_components_pack\traits\ConditionBuilder\ConditionBuilderLogicalOperationSet;
|
||||
use InvalidArgumentException;
|
||||
@@ -64,7 +65,9 @@
|
||||
// --- если ошибка
|
||||
if ($builder === false)
|
||||
// ---- то выбрасываем исключение
|
||||
throw new InvalidArgumentException("Неверный логический оператор: $condition / The logical operator is invalid: $condition.");
|
||||
throw new InvalidArgumentException(
|
||||
"Неверный логический оператор: $condition / The logical operator is invalid: $condition."
|
||||
);
|
||||
|
||||
// --- идём к следующему элементу
|
||||
continue;
|
||||
@@ -93,7 +96,7 @@
|
||||
* @return false|string Возвращает правильно отформатированный оператор или <code>false</code>, если оператор
|
||||
* не является логическим.
|
||||
*/
|
||||
private static function PrepareLogicalOperator (string $operator): false|string
|
||||
private static function PrepareLogicalOperator (string $operator): false | string
|
||||
{
|
||||
// Задаем массив логических операторов
|
||||
$logicalOperators = ['AND', 'OR', 'NOT', 'XOR', 'NAND', 'NOR'];
|
||||
@@ -178,6 +181,81 @@
|
||||
return new ConditionGroup($operator, $conditionItems);
|
||||
}
|
||||
|
||||
/**
|
||||
* Собирает условие в виде, пригодном для SQL.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
* @param array $conditions Условия.
|
||||
*
|
||||
* @return Tuple (string, array) Возвращает условие в виде, пригодном для SQL и массив параметров для защиты
|
||||
* от SQL-инъекций.
|
||||
*/
|
||||
private static function ProcessConditions (DBDriver $driver, array $conditions): Tuple
|
||||
{
|
||||
// Задаём массив частей
|
||||
$parts = [];
|
||||
|
||||
// Задаём массив параметров для защиты от SQL-инъекций
|
||||
$params = [];
|
||||
|
||||
// Задаём счётчик
|
||||
$count = 0;
|
||||
|
||||
// Перебираем условия
|
||||
foreach ($conditions as $condition) {
|
||||
// - если это группа условий
|
||||
if ($condition instanceof ConditionGroup) {
|
||||
// -- парсим её и добавляем результат
|
||||
$result = $condition->GetConditions($count);
|
||||
|
||||
// -- добавляем условие в массив частей
|
||||
$parts[] = $result->Get(0);
|
||||
|
||||
// -- добавляем параметры для защиты от SQL-инъекций в массив
|
||||
$params = array_merge($params, $result->Get(1));
|
||||
|
||||
// -- увеличиваем счётчик
|
||||
$count = $count + count($result->Get(1));
|
||||
|
||||
// -- идём к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если это условие
|
||||
if ($condition instanceof Condition) {
|
||||
// -- парсим его
|
||||
$result = $condition->Get($driver, $count);
|
||||
|
||||
// -- добавляем условие в массив частей
|
||||
$parts[] = $result->Get(0);
|
||||
|
||||
// -- добавляем параметры для защиты от SQL-инъекций в массив
|
||||
$params = array_merge($params, $result->Get(1));
|
||||
|
||||
// -- увеличиваем счётчик на 1
|
||||
$count++;
|
||||
|
||||
// -- идём к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// - иначе считаем, что это логический оператор, проверим это
|
||||
$condition = self::PrepareLogicalOperator($condition);
|
||||
|
||||
// - если это не логический оператор
|
||||
if ($condition === false)
|
||||
// -- то пропускаем его
|
||||
continue;
|
||||
|
||||
// - добавляем его в массив частей
|
||||
$parts[] = $condition;
|
||||
}
|
||||
|
||||
// Возвращаем результат
|
||||
return new Tuple(implode(' ', $parts), $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Добавляет группу условий.
|
||||
*
|
||||
@@ -194,16 +272,18 @@
|
||||
/**
|
||||
* Собирает условие в виде пригодном для SQL. Также возвращает массив параметров защиты от SQL-инъекций.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
*
|
||||
* @return Tuple (string, array) Возвращает условие в виде, пригодном для SQL и массив параметров для защиты от
|
||||
* SQL-инъекций.
|
||||
*/
|
||||
public function Build (): Tuple
|
||||
public function Build (DBDriver $driver): Tuple
|
||||
{
|
||||
// Очищаем цепочку от пустых элементов
|
||||
ArrayExtension::RemoveEmpties($this->Conditions);
|
||||
|
||||
// Парсим цепочку и возвращаем результат
|
||||
return $this->ProcessConditions($this->Conditions);
|
||||
return self::ProcessConditions($driver, $this->Conditions);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -337,78 +417,4 @@
|
||||
// Возвращаем объект
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Собирает условие в виде, пригодном для SQL.
|
||||
*
|
||||
* @param array $conditions Условия.
|
||||
*
|
||||
* @return Tuple (string, array) Возвращает условие в виде, пригодном для SQL и массив параметров для защиты
|
||||
* от SQL-инъекций.
|
||||
*/
|
||||
private function ProcessConditions (array $conditions): Tuple
|
||||
{
|
||||
// Задаём массив частей
|
||||
$parts = [];
|
||||
|
||||
// Задаём массив параметров для защиты от SQL-инъекций
|
||||
$params = [];
|
||||
|
||||
// Задаём счётчик
|
||||
$count = 0;
|
||||
|
||||
// Перебираем условия
|
||||
foreach ($conditions as $condition) {
|
||||
// - если это группа условий
|
||||
if ($condition instanceof ConditionGroup) {
|
||||
// -- парсим её и добавляем результат
|
||||
$result = $condition->GetConditions($count);
|
||||
|
||||
// -- добавляем условие в массив частей
|
||||
$parts[] = $result->Get(0);
|
||||
|
||||
// -- добавляем параметры для защиты от SQL-инъекций в массив
|
||||
$params = array_merge($params, $result->Get(1));
|
||||
|
||||
// -- увеличиваем счётчик
|
||||
$count = $count + count($result->Get(1));
|
||||
|
||||
// -- идём к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если это условие
|
||||
if ($condition instanceof Condition) {
|
||||
// -- парсим его
|
||||
$result = $condition->Get($count);
|
||||
|
||||
// -- добавляем условие в массив частей
|
||||
$parts[] = $result->Get(0);
|
||||
|
||||
// -- добавляем параметры для защиты от SQL-инъекций в массив
|
||||
$params = array_merge($params, $result->Get(1));
|
||||
|
||||
// -- увеличиваем счётчик на 1
|
||||
$count++;
|
||||
|
||||
// -- идём к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// - иначе считаем, что это логический оператор, проверим это
|
||||
$condition = self::PrepareLogicalOperator($condition);
|
||||
|
||||
// - если это не логический оператор
|
||||
if ($condition === false)
|
||||
// -- то пропускаем его
|
||||
continue;
|
||||
|
||||
// - добавляем его в массив частей
|
||||
$parts[] = $condition;
|
||||
}
|
||||
|
||||
// Возвращаем результат
|
||||
return new Tuple(implode(' ', $parts), $params);
|
||||
}
|
||||
}
|
@@ -8,6 +8,7 @@
|
||||
|
||||
use goodboyalex\php_components_pack\classes\Tuple;
|
||||
use goodboyalex\php_components_pack\interfaces\IArrayable;
|
||||
use goodboyalex\php_db_components_pack\enums\DBDriver;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
@@ -45,11 +46,12 @@
|
||||
/**
|
||||
* Формирует массив условий.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
* @param int $index Индекс замены параметров для защиты от SQL-инъекций.
|
||||
*
|
||||
* @return Tuple (string, array) Массив условий (строка SQL, параметры SQL).
|
||||
*/
|
||||
public function GetConditions (int $index = 0): Tuple
|
||||
public function GetConditions (DBDriver $driver, int $index = 0): Tuple
|
||||
{
|
||||
// Создаём результирующую строку
|
||||
$resultString = "";
|
||||
@@ -66,7 +68,7 @@
|
||||
$count++;
|
||||
|
||||
// - получаем условие
|
||||
$result = $this->WriteCondition($this->Conditions[$i], $count);
|
||||
$result = $this->WriteCondition($driver, $this->Conditions[$i], $count);
|
||||
|
||||
// - записываем условие в строку
|
||||
$resultString .= $result->Get(0);
|
||||
@@ -182,22 +184,23 @@
|
||||
/**
|
||||
* Формирует условие.
|
||||
*
|
||||
* @param DBDriver $driver Тип драйвера СУБД.
|
||||
* @param mixed $condition Условие.
|
||||
* @param int $index Индекс замены параметров для защиты от SQL-инъекций.
|
||||
*
|
||||
* @return string Возвращает условие в виде строки SQL.
|
||||
* @return Tuple Возвращает условие в виде строки SQL.
|
||||
*/
|
||||
private function WriteCondition (mixed $condition, int $index = 0): Tuple
|
||||
private function WriteCondition (DBDriver $driver, mixed $condition, int $index = 0): Tuple
|
||||
{
|
||||
// Проверяем, является ли условие объектом класса Condition
|
||||
if ($condition instanceof Condition)
|
||||
// - если да, то возвращаем его значение
|
||||
return $condition->Get($index);
|
||||
return $condition->Get($driver, $index);
|
||||
|
||||
// Проверяем, является ли условие объектом класса ConditionGroup
|
||||
if ($condition instanceof ConditionGroup)
|
||||
// - если да, то возвращаем его значения
|
||||
return $condition->GetConditions($index);
|
||||
return $condition->GetConditions($driver, $index);
|
||||
|
||||
// Если условие не является ни классом Condition, ни классом ConditionGroup, то это ошибка. Выбрасываем
|
||||
// исключение.
|
||||
|
@@ -36,16 +36,6 @@
|
||||
*/
|
||||
private ?PDO $DataBaseHandle;
|
||||
|
||||
/**
|
||||
* @var string $DBSignOpen Символ открытия для подстановки в запросы к базе.
|
||||
*/
|
||||
private string $DBSignOpen;
|
||||
|
||||
/**
|
||||
* @var string $DBSignСlose Символ закрытия для подстановки в запросы к базе.
|
||||
*/
|
||||
private string $DBSignClose;
|
||||
|
||||
/**
|
||||
* @var Closure $OnException Обработчик исключений. Анонимная функция формата:
|
||||
*
|
||||
@@ -96,21 +86,6 @@
|
||||
DBDriver::SQLite => "sqlite:$dbname"
|
||||
};
|
||||
|
||||
// Задаю DBSign
|
||||
// - Open
|
||||
$this->DBSignOpen = match ($this->Config->Driver) {
|
||||
DBDriver::MySQL, DBDriver::SQLite => '`',
|
||||
DBDriver::MSSQL => '[',
|
||||
DBDriver::PostgreSQL, DBDriver::OracleDB => '"'
|
||||
};
|
||||
|
||||
// - Close
|
||||
$this->DBSignClose = match ($this->Config->Driver) {
|
||||
DBDriver::MySQL, DBDriver::SQLite => '`',
|
||||
DBDriver::MSSQL => ']',
|
||||
DBDriver::PostgreSQL, DBDriver::OracleDB => '"'
|
||||
};
|
||||
|
||||
// Создаю объект для связи с базой данных
|
||||
$this->DataBaseHandle = new PDO($dsn, username: $user, password: $password);
|
||||
|
||||
|
Reference in New Issue
Block a user