Почему вы не можете передать функции MYSQL в подготовленные операторы PDO? - PullRequest
9 голосов
/ 23 ноября 2010

По-моему, должен работать следующий скрипт:

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = ?");
$stmt->execute(array(1, 'NOW()'));

, но при передаче NOW() в подготовленное утверждение ничего не происходит.Замена NOW() фактической датой (т.е. 2010-11-23) работает просто отлично.

Я не могу найти объяснение в Интернете.Любые идеи?

РЕДАКТИРОВАТЬ

Просто чтобы прояснить и избавиться от путаницы в вопросе, я хочу на самом деле передать переменную в подготовленный оператор ОДНАКО, переменная будет установлена ​​на один изпять возможных функций даты / времени для mysql.

например,

$ var = 'NOW ()';

$ var = 'LAST_DAY (DATE_ADD (CURDATE (), ИНТЕРВАЛ 1 МЕСЯЦ))';

$ var = 'LAST_DAY (CURDATE ())';

... и т. Д. *

подготовленный оператор превращается в:

$stmt->execute(array(1, $var));

Я знаю, что это вернет те же результаты NULL, но я волнуюсь, если я просто изменю выражение sql на:

Таблица обновлений SET status =?, Date_modified = $ var

Я открываюсь для инъекции?

Ответы [ 3 ]

13 голосов
/ 23 ноября 2010

Вам не нужно передавать NOW() в качестве параметра, поскольку нет необходимости выполнять какую-либо обработку для него, поскольку это встроенная функция SQL, поэтому просто включите его в реальный запрос, как показано ниже.

$stmt = $db->prepare("UPDATE table SET status = ?, date_modified = NOW()");

В качестве альтернативы, вы можете просто установить date_modified в поле TIMESTAMP, и оно автоматически обновит поле date_modified при обновлении SQL.

7 голосов
/ 23 ноября 2010

Подготовленные операторы интерпретируют все, что вы вставляете в них, как буквальную строку.Это необходимо для предотвращения любого непредсказуемого внедрения SQL.

На самом деле происходит то, что NOW() пытается вставить в базу данных так же, как она читает (буквально, NOW()) вместо получения фактической даты для вставки.Тогда, вероятно, в вашей базе данных отображается пустое значение, поскольку у вас есть столбец даты, который не интерпретирует NOW() как дату и, следовательно, не принимает ее.

Если возможно, вам следует попытаться выполнитьSQL без использования методов подстановки, поскольку в этом подходе нет ничего опасного.

0 голосов
/ 23 ноября 2010

Я предполагаю, что PDO предполагает, что NOW () является строкой и заключает ее в кавычки при заполнении параметров запроса. Я бы просто передал текущую дату, используя функцию PHP date ('Y-m-d'), которая даст вам те же результаты.

...