Jsonb-экзистенциальные операторы с параметризованными запросами
... или вопросительный знак вопроса.
В настоящее время я реализую функцию поиска для базы данных postgres, в php, которая использует новый тип jsonb.
Для этого я выполняю подготовленные заявления с именованными заполнителями.
Однако я столкнулся с интересной проблемой, пытаясь использовать некоторые из новых postgres
Это не удается, поскольку знак вопроса интерпретируется как заполнитель.
Чтобы обойти это, я попытался сделать сам оператор именованным параметром.
$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta :operator :value");
$sth->bindValue(1, $operator, PDO::PARAM_STR);
$sth->bindValue(2, $value, PDO::PARAM_STR);
$sth->execute();
Однако это просто вызывает ту же ошибку, что и при использовании оператора bare, т.е.
ERROR: syntax error at or near \"$1\"1
Кто-нибудь еще сталкивается с этой проблемой или кто-нибудь может подумать о хорошем обходном пути?
Есть ли способ уйти или передать знак вопроса, чтобы можно было использовать операторы сдерживания jsonb postgres и существования с параметризованными запросами PDO?
Ответы
Ответ 1
вы можете использовать соответствующие функции вместо операторов (jsonb_exists, jsonb_exists_any, jsonb_exists_all). например, запустите \do+ "?"
в psql, чтобы увидеть имя функции? Оператор.
или определить собственного оператора без "?" вместо этого.
Например:
CREATE OPERATOR [email protected] (LEFTARG = jsonb, RIGHTARG = text, PROCEDURE = jsonb_exists)
CREATE OPERATOR [email protected]| (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any)
CREATE OPERATOR [email protected]& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_all)
Таким образом, вместо ?
, ?|
и ?&
можно использовать [email protected]
, [email protected]|
и [email protected]&
соответственно. например.
$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta [email protected] :value");
$sth->bindValue(1, $value, PDO::PARAM_STR);
$sth->execute();