【问题标题】:How to use placeholders in JSON (RedBeanPHP)?如何在 JSON (RedBeanPHP) 中使用占位符?
【发布时间】:2020-12-25 22:11:13
【问题描述】:

我有一个任务:检查$username 是否对标识符为$id 的记录进行了投票。为此,我需要检查 JSON 数组(位于“votes”单元格中)中的“upvote”字段是否包含用户名(即$username)。所以我写了这段代码(PostgreSQL DB):

$foo = R::getRow('SELECT "votes"::jsonb @> \'{"upvote":[":username"]}\'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id,":username"=>$username];

问题是RedBeanPHP在替换占位符的时候是用单括号括起来的,但是PostgreSQL要求我把JSON数组的字段/值的名称用双引号括起来。

那么我怎样才能使 RB 不使用单引号包裹占位符呢?或者如何让占位符用双引号括起来?

【问题讨论】:

    标签: sql postgresql pdo redbean


    【解决方案1】:

    无需手动编写 JSON 并通过 RB 在其中填充占位符。 需要创建一个具有所需JSON结构的数组,并使用现成的数组/变量来填充它。

    我是这样做的:

    $username_in_array = array('upvote' => array($username));
    $username_in_json = json_encode($username_in_array);
    $is_upvoted = R::getRow('SELECT "votes"::jsonb @> :username::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id,":username"=>$username_in_json];
    

    请求采用以下形式:

    SELECT "votes"::jsonb @> '{"upvote":["admin"]}'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = 1
    

    我检查过 - 它有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-13
      • 2014-05-21
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多