在PostgreSQL

时间:2016-03-23 08:46:42

标签: php postgresql pdo

注意:

此问题可视为此Question的副本。 它确实指出了与PDO相同的问题。但它的解决方案解决方案有点不同,因为目标不同。我将在那里发布JSONB的解决方法和PHP票证的链接。

当我准备以下查询时:

SELECT * FROM post WHERE locations ? :location;

发生以下警告:

  

警告:PDO :: prepare():SQLSTATE [HY093]:参数号无效:第xx行/ path/file.php中的命名和位置参数混合

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

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

我将发布一个解决方法。希望有更好的方法

修改 我在PHP错误跟踪系统

中添加ticket

6 个答案:

答案 0 :(得分:5)

这是我的问题的解决方法。它通过使用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)是avialabe

答案 1 :(得分:1)

好的,最简单的方法是create the new operator使用相同的选项,例如:

-- Operator: ~!@#%^&(jsonb, text)

-- DROP OPERATOR ~!@#%^&(jsonb, text);

CREATE OPERATOR 
  ~!@#%^& -- Change it to any other non-conflicted symbols combination
(
  PROCEDURE = jsonb_exists,
  LEFTARG = jsonb,
  RIGHTARG = text,
  RESTRICT = contsel,
  JOIN = contjoinsel);
COMMENT ON OPERATOR ~!@#%^&(jsonb, text) IS 'key exists';

(原始脚本由pgAdmin生成)

并以通常的方式使用它,如

SELECT * FROM post WHERE locations ~!@#%^& :location;

答案 2 :(得分:0)

您可以使用

  • jsonb_exists而非?
  • jsonb_exists_any而非?|
  • jsonb_exists_all而非?&

但是postgresql site上没有文件。

答案 3 :(得分:0)

对于搜索键并根据Yoann的答案,我已经测试了表达式(jsonbData?'keySearched')等同于jsonb_exists(jsonbData,'keySearched')

答案 4 :(得分:0)

使用CREATE OPERATOR ~@& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any)并使用〜@&代替?|一切都会很好

答案 5 :(得分:0)

这对我有用:

jsonb_exists(some_jsonb_array,'search_value');