Почему вы не можете передавать функции MYSQL в подготовленные инструкции PDO?

На мой взгляд, следующий сценарий должен работать:

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

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

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

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

Чтобы еще больше прояснить и избавиться от какой-либо путаницы в вопросе, я хочу передать переменную в подготовленный оператор HOWEVER, переменная будет установлена ​​на одну из пяти возможных функций даты / времени для mysql.

например

$ var = 'NOW ()';

$ var = 'LAST_DAY (DATE_ADD (CURDATE (), INTERVAL 1 МЕСЯЦ))';

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

… и так далее…

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

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

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

UPDATE table SET status =?, Date_modified = $ var

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

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

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

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

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

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

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

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