По сути, у меня есть значение, которое я должен вызвать пару раз в моем SQL-запросе. Таким образом, возможно ли повторное использование одного и того же имени в заявлении, например, SELECT :Param FROM Table WHERE Column = :Param
, а затем просто bindValue (": Param") и имеет значение для обоих: Params?
PDO :: prepare утверждает, что «вы не можете использовать маркер именованного параметра с тем же именем дважды в подготовленном заявлении», поэтому я предполагаю, что это не так.
Помимо повторного использования, основной проблемой здесь является то, что вы пытаетесь динамически изменять имена 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 с исключением, созданным в условии по умолчанию:.
Вы можете установить PDO::ATTR_EMULATE_PREPARES = true
.
Например $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
,
Если вы используете Laravel, вы можете установить это в массиве options
в config/database.php
. например PDO::ATTR_EMULATE_PREPARES => true