Intereting Posts
Какие системные файлы должны находиться в закрытой среде для правильной работы php-fpm на ubuntu? Отключить маршрутизацию Laravel для определенной папки / маршрута Автоматическая обрезка mp3 в PHP Как сохранить данные POST через ajax-запрос после перенаправления .htaccess? Как отредактировать implode, чтобы он присоединил значения к двум строкам? Как создать событие Календаря Google без напоминания / Как получить учетные записи службы для олицетворения пользователей Ограничить количество ссылок, показанных с разбиением на страницы Laravel Как я могу получить часовой пояс локального сервера? Лучший способ хранения пользовательских настроек в MySQL? PHP Facebook graph API поиск cURL – нет результатов Проверка даты php Как мы можем получить конкретные ссылки, используя простой html dom Проблемы с вручную wp_install () CodeIgnitor валидация переменных / входных данных, не входящих в форму? Система дружбы с Laravel: отношения Many to Many

Как игнорировать вопросительный знак в качестве заполнителя при использовании PDO с PostgreSQL

Заметка:

Этот вопрос можно рассматривать как дубликат этого Вопроса . Это указывает на ту же проблему с PDO. Но его решение обходного решения немного отличается по мере того, как цель отличается. Я опубликую там обходной путь для JSONB и ссылку на билет PHP.

Когда я подготовлю следующий запрос:

SELECT * FROM post WHERE locations ? :location; 

Появляется следующее предупреждение:

Предупреждение: PDO :: prepare (): SQLSTATE [HY093]: недопустимый номер параметра: смешанные имена и позиционные параметры в /path/file.php в строке xx

Вопросительный знак является допустимым оператором PostgreSQL, но PDO рассматривает его как заполнитель.

Есть ли способ настроить PDO, чтобы игнорировать знак вопроса в качестве заполнителей?

Я напишу обходной рев. Надеясь, что есть лучший способ

Редактировать Я добавляю билет в систему отслеживания ошибок PHP

Solutions Collecting From Web of "Как игнорировать вопросительный знак в качестве заполнителя при использовании PDO с PostgreSQL"

Это обходной путь к моей проблеме. Он решает проблему, используя функцию 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;