Использование подготовленных инструкций PDO с переменной MySQL Query - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь увеличить строки в таблице с помощью PHP PDO, и я пришел с этим запросом

UPDATE users SET log = ? 

Я пытаюсь сделать обновление на основе предыдущего значения в каждом столбце журнала

Итак, если бы моя таблица была такой, как раньше

+----+------+------+-----------+--------+ | id | name | age | eye_color | log | +----+------+------+-----------+--------+ | 21 | OLa | 19 | black | 1 | | 22 | OLa | 19 | Green | 2 | | 23 | OLa | 19 | Grey | 3 | +----+------+------+-----------+--------+

Ожидаю получить этот результат

+----+------+------+-----------+--------+ | id | name | age | eye_color | log | +----+------+------+-----------+--------+ | 21 | OLa | 19 | black | 2 | | 22 | OLa | 19 | Green | 3 | | 23 | OLa | 19 | Grey | 4 | +----+------+------+-----------+--------+

Я обнаружил, что могу сделать значение моего заполнителя равным

log + 1

Там, сделав полный запрос

UPDATE users SET log = log + 1

Это хорошо работает, когда я использую метод запроса PDO, а такжеиз моего терминала проблема возникает, когда я пытаюсь обновить это, используя подготовленные операторы, если я сделал

$stmt = $this->pdo->prepare("UPDATE users SET log = ?");
$stml->execute(['height + 1']);

Тогда все столбцы журнала становятся 0.

Есть что-то, что я делаю неправильно?Я также знаю, что могу просто сделать запрос простым

$stmt = $this->pdo->prepare("UPDATE users SET log = log + 1");
$stmt->execute(['log + 1']);

Но я бы предпочел мой первоначальный подход, я работаю с некоторыми ограничениями.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы не можете использовать параметры запроса для вставки выражений в ваш синтаксис.Параметры не просто строковая интерполяция.В противном случае было бы бесполезно использовать их, потому что вы уже можете легко выполнять интерполяцию строк в PHP.

Весь смысл параметров запроса заключается в том, что значение объединяется с запросом на сервере, после синтаксис SQL был проанализирован, поэтому вам уже поздно вставлять любой новый синтаксис, например выражение.

Параметры запроса всегда обрабатываются как одно скалярное значение.Нельзя использовать параметр для:

  • идентификаторов таблицы
  • идентификаторов столбцов
  • ключевых слов SQL
  • выражений
  • списковзначений

Как объяснили другие, в этом случае вам все равно не нужно использовать параметр запроса.Использование буквального выражения log + 1 непосредственно в вашем запросе безопасно.В запрос не вставляется ненадежный контент (от пользователей или из других источников), поэтому нет риска внедрения SQL.

0 голосов
/ 21 февраля 2019

Поскольку вы не получаете информацию от пользователя и суммируете 1 в столбце, вы можете безопасно выполнять обычный запрос.

UPDATE users SET log = log + 1

Если вы используете оператор подготовки, вам придется запроситьВ столбце получите текущее значение, а затем по второму запросу выполните обновление и добавьте к нему 1.

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