php - 在 PostgreSQL 中使用 PDO 时如何忽略问号作为占位符

标签 php postgresql pdo

注意事项:

这个问题可以被认为是这个 Question 的重复. 它确实指出了与 PDO 相同的问题。但由于目标不同,其变通解决方案略有不同。我将在那里发布 JSONB 的解决方法和 PHP 票证的链接。

当我准备以下查询时:

SELECT * FROM post WHERE locations ? :location;

出现以下警告:

Warning: PDO::prepare(): SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters in /path/file.php on line xx

问号是有效的 PostgreSQL operator但 PDO 将其视为占位符。

是否有正确的方法来配置 PDO 以忽略作为占位符的问号?

我将在下面发布解决方法。希望有更好的方法

编辑 我添加一个 ticket在 PHP 错误跟踪系统中

最佳答案

这是解决我的问题的方法。它通过使用 PostgreSQL 函数替换 ? 运算符来解决问题。

我不太喜欢它,因为它不会使 PDO 更符合 PostgreSQL。但我没有找到真正的解决方案。

CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$
    SELECT $1 ? $2
$f$;

现在我可以使用查询了:

SELECT * FROM post WHERE json_key_exists(locations, :location);

解决方法是由来自 freenode #postgresql 的出色的 RhodiumToad 建议的

编辑

正如@Abelisto 所建议的,没有必要创建上面的函数,因为 jsonb_exists(jsonb, text) is avialabe

关于php - 在 PostgreSQL 中使用 PDO 时如何忽略问号作为占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36173440/

相关文章:

php - 如何到达这个嵌套数组/对象的特定部分

python - 将 SQL 结果从自连接转换为方形 pandas 数据框

sql - 加快数据在两个日期之间的 PostgreSQL 查询

php - 构建时的angular-cli重命名索引

php - Facebook SDK 包装器的自动化测试

php - 直接从 POST 值设置 SESSION 变量

postgresql - 基于 NHibernate 公式的属性 + PostgreSQL 区间

php - HY093 在 PDO 中执行预备语句时出错

PHP 使用 FetchAll 创建函数

php - 是否需要关闭 PDO 连接