На мой взгляд, следующий сценарий должен работать:
$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»), которая даст вам те же результаты.