一尘不染

如何防止PDO将问号解释为占位符?

php

为了检测hstore中密钥的存在,我需要运行如下查询:

SELECT * FROM tbl WHERE hst ? 'foo'

但是,这给了我一个PDOException:

PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound: SELECT * FROM tbl WHERE hst ? 'foo'

有什么办法可以逃脱问号,以便PDO不会将其用作占位符?我尝试使用最多四个反斜杠以及一个双问号(??),但似乎没有什么能说服PDO留下问号。


阅读 276

收藏
2020-05-29

共1个答案

一尘不染

使用函数调用表单。根据系统目录,hstore ?运算符使用以下exist功能:

regress=# select oprname, oprcode from pg_operator where oprname = '?';
 oprname | oprcode 
---------+---------
 ?       | exist
(1 row)

所以你可以这样写:

SELECT * FROM tbl WHERE exist(hst,'foo');

(个人而言,我不是hstore以操作员为中心的设计和文档的忠实拥护者,我认为它放弃了基于函数的接口的有用的自我记录属性,而没有任何实际好处,并且我通常使用其函数调用而不是其操作员。只是因为您可以定义运算符并不意味着您应该这样做。)

2020-05-29