注意事项:
这个问题可以被认为是这个 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/