Этот вопрос можно рассматривать как дубликат этого Вопроса . Это указывает на ту же проблему с PDO. Но его решение обходного решения немного отличается по мере того, как цель отличается. Я опубликую там обходной путь для JSONB и ссылку на билет PHP.
Когда я подготовлю следующий запрос:
SELECT * FROM post WHERE locations ? :location;
Появляется следующее предупреждение:
Предупреждение: PDO :: prepare (): SQLSTATE [HY093]: недопустимый номер параметра: смешанные имена и позиционные параметры в /path/file.php в строке xx
Вопросительный знак является допустимым оператором PostgreSQL, но PDO рассматривает его как заполнитель.
Есть ли способ настроить PDO, чтобы игнорировать знак вопроса в качестве заполнителей?
Я напишу обходной рев. Надеясь, что есть лучший способ
Редактировать Я добавляю билет в систему отслеживания ошибок PHP
Это обходной путь к моей проблеме. Он решает проблему, используя функцию PostgreSQL для замены ?
оператор.
Мне это не очень нравится, потому что это не делает PDO более совместимым с PostgreSQL. Но я не нашел реального решения.
CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$ SELECT $1 ? $2 $f$;
И теперь я могу использовать запрос:
SELECT * FROM post WHERE json_key_exists(locations, :location);
Обходной путь был предложен сказочным RhodiumToad от freenode #postgresql
Как предположил @Abelisto, нет необходимости создавать функцию выше, поскольку jsonb_exists(jsonb, text)
является avialabe
Итак, самый простой способ – создать новый оператор с такими же параметрами, как:
-- Operator: ~!@#%^&(jsonb, text) -- DROP OPERATOR ~!@#%^&(jsonb, text); CREATE OPERATOR ~!@#%^& -- Change it to any other non-conflicted symbols combination ( PROCEDURE = jsonb_exists, LEFTARG = jsonb, RIGHTARG = text, RESTRICT = contsel, JOIN = contjoinsel); COMMENT ON OPERATOR ~!@#%^&(jsonb, text) IS 'key exists';
(Оригинальный скрипт был сгенерирован pgAdmin)
И используйте его обычным способом, как
SELECT * FROM post WHERE locations ~!@#%^& :location;