...或者问号问题。
我目前正在 php 中实现 postgres 数据库的搜索功能,该功能使用新的 jsonb 类型。
为了实现这一目标,我正在执行带有命名占位符的准备好的语句。
然而,我在尝试使用一些新的 postgres 时遇到了一个有趣的问题JSON 包含和存在运算符 http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSON-OP-TABLE以及命名占位符。
问题的根源是运营商自己使用问号?
作为其语法的一部分。 IE。
?
JSON 值中是否存在键/元素字符串?
?|
这些键/元素字符串是否存在?
?&
所有这些键/元素字符串都存在吗?
这意味着我的 PHP 语句看起来像这样。
$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta ? :value");
$sth->bindValue(1, $value, PDO::PARAM_STR);
$sth->execute();
失败是因为问号被解释为占位符。
为了解决这个问题,我尝试使操作符本身成为一个命名参数,如下所示。
$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();
然而,这只会引发与使用裸运算符相同的错误,即
ERROR: syntax error at or near \"$1\"1
有其他人遇到过这个问题或者有人能想到一个好的解决方法吗?
有没有一种方法可以转义或传递问号,以便可以将 postgres jsonb 包含和存在运算符与 PDO 参数化查询一起使用?