165 lines
6.5 KiB
PHP
165 lines
6.5 KiB
PHP
<?php
|
|
/**
|
|
* @noinspection SqlNoDataSourceInspection
|
|
*/
|
|
|
|
namespace goodboyalex\php_db_components_pack\traits\Database;
|
|
|
|
use goodboyalex\php_db_components_pack\classes\ConditionBuilder;
|
|
use goodboyalex\php_db_components_pack\enums\DBOperation;
|
|
use goodboyalex\php_db_components_pack\interfaces\IDBItem;
|
|
use PDO;
|
|
|
|
/**
|
|
* Трейт для обновления записей в таблице базы данных.
|
|
*
|
|
* @author Александр Бабаев
|
|
* @package php_db_components_pack
|
|
* @version 1.0
|
|
* @since 1.0
|
|
* @see PDO
|
|
*/
|
|
trait DatabaseUpdate
|
|
{
|
|
/**
|
|
* Заменяет данные в строке базы данных.
|
|
*
|
|
* @param string $table Имя таблицы.
|
|
* @param array $set Массив данных для замены
|
|
* @param array $where Массив условий
|
|
*
|
|
* @return bool Результат выполнения
|
|
*/
|
|
public function UpdateOld (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;
|
|
}
|
|
|
|
public function Update (string $table, IDBItem $item): bool
|
|
{
|
|
$primaryKeys = $this->FindPrimaryKeys($item, DBOperation::Update);
|
|
|
|
$pk_keys = array_keys($primaryKeys);
|
|
|
|
$where = new ConditionBuilder();
|
|
|
|
for ($i = 0; $i < count($primaryKeys); $i++) {
|
|
if ($i > 0)
|
|
$where = $where->And();
|
|
|
|
$whereKey = $pk_keys[$i];
|
|
|
|
$whereValue = $primaryKeys[$whereKey];
|
|
|
|
$where = $where->WhereEquals($whereKey, $whereValue);
|
|
}
|
|
|
|
$dbItem = $this->GetRow($table, $where, className: get_class($item));
|
|
|
|
// Создаю массив параметров
|
|
$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;
|
|
}
|
|
} |