Подтвердить что ты не робот

PDO Parameterized Query - повторное использование именных заполнителей?

В сущности, у меня есть значение, которое я должен вызвать пару раз в своем SQL-запросе. Таким образом, возможно ли повторное использование одного и того же имени в заявлении, например. SELECT :Param FROM Table WHERE Column = :Param, затем просто bindValue ( ": Param" ), и есть ли значение для обоих: Params?

4b9b3361

Ответ 1

PDO:: prepare заявляет, что "вы не можете использовать маркер именованного параметра с тем же именем дважды в подготовленном заявлении", поэтому я предполагаю что нет.

Ответ 2

Вы можете установить PDO::ATTR_EMULATE_PREPARES = true.

например. $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);.

Если вы используете Laravel, вы можете установить это в массиве options в config/database.php. например PDO::ATTR_EMULATE_PREPARES => true

Ответ 3

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

Этот ответ отправлен анонимным пользователем на http://php.net/manual/en/pdo.prepare.php:

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

Существует распространенное заблуждение о том, как заполнители в подготовленном операторы: они не просто заменяются как (экранированные) строки и полученный SQL-код. Вместо этого СУБД попросила "Подготовить" выражение выдается с полным планом запроса о том, как это будет выполнять этот запрос, включая таблицы и индексы которые будут одинаковыми независимо от того, как вы заполняете заполнители.

План "SELECT name FROM my_table WHERE id =: value" будет что бы вы ни заменили ": значение", но, похоже, похоже "SELECT name FROM: table WHERE id =: value" не может быть запланировано, потому что СУБД не знает, какую таблицу вы собираетесь выбрать.

Даже при использовании "эмулируемых препаратов" PDO не может позволить вам использовать заполнители где угодно, потому что это должно будет решить, что вы означает: "Выберите: foo From some_table" означает ": foo" будет столбца или литеральной строки?

Когда ваш запрос использует динамическую ссылку на столбец, вы должны явно указывать столбцы, которые, как вы знаете, существуют в таблице, например. используя оператор switch с исключением, указанным в предложении по умолчанию:

Ответ 4

Многие запросы, подобные вашему, могут быть переписаны с использованием только одного заполнителя.

SELECT :Param FROM Table WHERE Column = :Param

будет так же, как

SELECT Column FROM Table WHERE Column = :Param

Но иногда это не так просто. Например:

SELECT *
FROM my_table
WHERE first_name LIKE :Param
   OR last_name  LIKE :Param
   OR biography  LIKE :Param

В таком случае вы можете повторно использовать значение параметра, хранящее его в производной таблице с перекрестными связями (подзапрос в предложении FROM):

SELECT t.*
FROM my_table t
CROSS JOIN (SELECT :Param as Param) AS x
WHERE first_name LIKE x.Param
   OR last_name  LIKE x.Param
   OR biography  LIKE x.Param