PDO: предотвращение перезаписи значения, если столбец UPDATE: и столбец WHERE: совпадают - PullRequest
0 голосов
/ 07 мая 2018

У меня есть функция, которая связывает / подготавливает инструкцию, затем выполняет ее:

function db_update ($table, $set, $where_col, $where_val)
{
    $s = "UPDATE `$table` SET ";
    foreach ($set as $k => $v)
        $s.= "$k = :".trim($k).", ";
    $s = trim($s, ', ');
    $s.= " WHERE `$where_col` = :$where_col";

    $binds = array();
    foreach ($set as $k => $v)
        $binds[':'.$k] = trim($v);
    $binds[':'.$where_col] = trim($where_val);

    return db_run($s, $binds);
}

В основном db_run использует ваши обычные методы PDO:

function db_run($stmt, $binds = array())
{
    // ...      
    $sth = $db->prepare($stmt);
    $sth->execute($binds);      
    // ...
}

Пример использования A:

db_update('table', ['color' => 'red'], 'fruit', 'apple');

Результат:

  • Подготовлено: UPDATE table SET color = :color WHERE fruit = :fruit
  • Фактический: UPDATE table SET color = 'red' WHERE fruit = 'apple'

Это работает просто отлично, но моя главная проблема в том, что если использование будет таким:

Пример использования B:

db_update('table', ['color' => 'red'], 'color', 'black');

Результат:

  • Подготовлено: UPDATE table SET color = :color WHERE color = :color
  • Факт: UPDATE table SET color = 'black' WHERE color = 'black'

Как мне сделать так, чтобы фактический результат был:

UPDATE table SET color = 'red' WHERE color = 'black'

1 Ответ

0 голосов
/ 07 мая 2018

Вы получаете этот результат, потому что вы используете параметр :color в обоих местах (SET и WHERE) в вашем запросе. Таким образом, ваша функция db_update() должна использовать другое имя параметра для предложения WHERE.

function db_update ($table, $set, $where_col, $where_val)
{
    $s = "UPDATE `$table` SET ";
    foreach ($set as $k => $v)
        $s.= "$k = :".trim($k).", ";
    $s = trim($s, ', ');
    $s.= " WHERE `$where_col` = :where_$where_col";

    $binds = array();
    foreach ($set as $k => $v)
        $binds[':'.$k] = trim($v);
    $binds[':where_'.$where_col] = trim($where_val);

    return db_run($s, $binds);
}

Это должно привести к готовому результату UPDATE table SET color = :color WHERE color = :where_color

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...