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();
  • Вопрос задан
  • 809 просмотров
Решения вопроса 1
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();


Но, друзья, это ведь костыль!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Заменить на exists_any(variations, array[ 'something' ])
stackoverflow.com/questions/16311939/how-to-preven...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы