PDO: передайте функцию MySQL в bindValue/bindParam

можно ли вставить функции MySQL, используя bindValue()? Мой код ниже просто выводится как строка 'NOW()' вместо функции NOW() (без кавычек).

$sthandler->bindValue(1, 'NOW()');

2 ответов


нет. Параметр запроса заменяет только одно постоянное значение. Например, числовая константа или строковое значение или дату.

все остальное -- имена столбцов, имена таблиц, ключевые слова SQL, функции, выражения -- должно быть в строке SQL во время синтаксического анализа.


Re ваш комментарий:

вы должны понимать, что параметры не просто удобство для интерполяции дополнительных строк в ваш SQL. Подготовка аналогична этап компиляции для Java или C#, тогда как EXECUTE аналогичен запуску скомпилированного кода.

время подготовки-это когда СУБД выполняет проверку синтаксиса, а также проверку ссылок. Он должен давать ошибку, если вы называете таблицу, которая не существует, или вызываете функцию, которая не существует.

вы не можете передавать имена таблиц или вызовы функций в качестве параметров, потому что тогда СУБД не сможет проверить эти ссылки во время подготовки. Вы не должны использовать запрос параметр для изменения синтаксиса инструкции или введения недопустимых таблиц или функций.

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


нет, потому что заполнители в подготовленных операторах автоматически экранируются. Таким образом, в вашем случае он увидит, что это строка и (по крайней мере) поставит ее в кавычки 'NOW()'. Теперь это просто строка для mysql для mysql тоже. Вы можете установить текущее datetime с помощью PHP

$sthandler->bindValue(1, date('c'));