2025-08-02 15:45:51 +03:00

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;
}
}