Как запретить PDO интерпретировать вопросительный знак как заполнитель?

Для обнаружения существования ключа вhstoreМне нужно выполнить запрос, как это:

SELECT * FROM tbl WHERE hst ? 'foo'

Тем не менее, это дает мне исключение PDO:

PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound: SELECT * FROM tbl WHERE hst ? 'foo'

Есть ли способ избежать знака вопроса, чтобы PDO не выбрал его в качестве заполнителя? Я пробовал с четырьмя обратными слешами, а также с двойным знаком вопроса (??), но ничто не может убедить PDO оставить вопросительный знак в покое.

Ответы на вопрос(3)

Решение Вопроса

магазин? Оператор используетexist функция:

regress=# select oprname, oprcode from pg_operator where oprname = '?';
 oprname | oprcode 
---------+---------
 ?       | exist
(1 row)

так что вы можете написать:

SELECT * FROM tbl WHERE exist(hst,'foo');

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

 David Chan04 июн. 2014 г., 17:52
я использую это сейчас, но, к сожалению, нет замены функции для? & и? | операторы. Я думаю, я могу написать свой собственный ... отстой.
 Joshua Burns01 июл. 2016 г., 04:34
При замене? оператор для использования с типами данных JSONB, заменитьEXIST() с участиемJSONB_EXISTS().
 Craig Ringer04 июн. 2014 г., 17:56
А? Должна быть функция, поддерживающая любого оператора. Конечно же, подключив их к вышеупомянутому,?& являетсяexists_all а также?| являетсяexists_any.

сВот

SELECT * FROM post WHERE locations ? :location;

Обходной путь наPostgreSQL 9.5 похож:

SELECT * FROM post WHERE jsonb_exists(locations, :location);

Я также открылпроездной билет в системе отслеживания ошибок PHP

Обновить

Как уже упоминалось в Diabl0, предлагаемое решение работает, но не использует индекс. Протестировано с:

CREATE INDEX tempidxgin ON post USING GIN (locations);
 michaelbn23 мар. 2016 г., 15:35
@YourCommonSense Я упомянул, что обходной путь (решение) отличается и стоит подчеркнуть. Понятия не имею, что вы подразумеваете под всеми. Это ориентировано и определено в соответствующих местах.
 Diabl026 июн. 2017 г., 10:58
Это решение, как оно работает, имеет один огромный недостаток - запросы с использованием функций jsonb не используют индексы, которые могут привести к значительному снижению производительности.
 Joshua Burns01 июл. 2016 г., 04:32
Вышеуказанное решение также работает в PostgreSQL 9.4.
 Your Common Sense23 мар. 2016 г., 12:38
Пожалуйста, не оставляйте свой ответ на все вопросы такого рода. вместо этого отметьте их как дубликаты.

чтобы знаки вопроса были проигнорированы:

$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
 IMSoP23 мар. 2016 г., 12:51
Каким бы способом вы не установили этот параметр, PDO выполняет синтаксический анализ некоторых операторов и неправильно интерпретирует?.
 Joshua Burns16 февр. 2018 г., 00:39
Этот ответ работает для меня, хотя он не работал на версии PHP, которую я использовал раньше. Пытался изменить downvote на upvote, не дадите мне, если вы не пересматриваете;)

Ваш ответ на вопрос