Задать вопрос
Machez
@Machez
Бу!

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

В 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();
  • Вопрос задан
  • 815 просмотров
Подписаться 1 Оценить 5 комментариев
Решение пользователя Ken Jee К ответам на вопрос (2)
Machez
@Machez Автор вопроса
Бу!
Для решения этой ситуации на http://stackoverflow.com предлагают создать свои собственные операторы без символа ? и выглядит это вот так:

-- Because PHP::PDO replace symbol '?' into SQL-query we can not use this operator for work with JSONB type.

-- alternative operator for '?'
CREATE OPERATOR ~@ (LEFTARG = jsonb, RIGHTARG = text, PROCEDURE = jsonb_exists);

-- alternative operator for '?|'
CREATE OPERATOR ~@| (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any);

-- alternative operator for '?&'
CREATE OPERATOR ~@& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_all);


Теперь мною приведенный выше PHP-код стал рабочим (разумеется я заменил оператор ?| на ~@|
$statement = "SELECT id FROM public.parameter WHERE variations ~@| array[ '" . mb_strtolower( $title ) . "' ] LIMIT 1 OFFSET 0;";
$sth = $this->pdo->prepare( $statement );
$sth->execute();


Но, друзья, это ведь костыль!
Ответ написан