Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Как запретить биндить символ знака вопроса в SQL-запросе при использовании PDO в PHP?

В SQL-запросе используется символ знака вопроса - ? и PDO пытается биндить к нему значение ($1), но в данной ситуации это совершенного не нужно, т.к. символ знака вопроса это оператор языка SQL для работы с типом данных JSONB. Как обойти этот механизм присвоения значений?
$statement = "SELECT id FROM public.parameter WHERE variations ?| array[ 'something' ] LIMIT 1 OFFSET 0;"; $sth = $this->pdo->prepare( $statement ); $sth->execute();


Ответ

Вместо таких операторов можно использовать соответствующие функции (jsonb_exists, jsonb_exists_any, jsonb_exists_all). К примеру, если запустить в psql команду \do+ "?", выведется имя функции, которая вызывается оператором ? А можно определить собственный оператор без символов ?, например:
CREATE OPERATOR ~@ (LEFTARG = jsonb, RIGHTARG = text, PROCEDURE = jsonb_exists) CREATE OPERATOR ~@| (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any) CREATE OPERATOR ~@& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_all) ...чтобы использовать ~@, ~@| и ~@& вместо ?, ?| и ?& соответственно. Пример:
$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta ~@ :value"); $sth->bindValue(1, $value, PDO::PARAM_STR); $sth->execute();
Это перевод вот этого ответа с английского StackOverflow от пользователя alexius

Комментариев нет:

Отправить комментарий