【问题标题】:PostgreSQL param binding conflicts with JSONB operatorsPostgreSQL 参数绑定与 JSONB 运算符冲突
【发布时间】:2019-10-09 06:49:35
【问题描述】:

我正在更新我的 postgreSQL 数据库中的 JSONB 字段(使用 PHP Symfony DBAL),但我还使用参数样式数据绑定来消除 SQL 注入的风险。

我的查询如下所示:

UPDATE car SET 
  features = 
    CASE
      WHEN features ? 'exterior' THEN
        JSONB_SET(features, '{exterior, ' || :type || '}', TO_JSONB(:property::TEXT))
      ELSE JSONB_SET(features, '{exterior}', '{' || :type || ': ' || :property || '}'::JSONB)
    END
WHERE id IN (:ids);

我的代码如下所示:

$stmt = $this->db()->executeQuery($sql,
           ['type' => 'color', 'property' => 'red', 'ids' => [12,32,43,232,3442]],
           ['type' => \PDO::PARAM_STR, 'date' => \PDO::PARAM_STR, 'ibcodes' => \Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
        );

我得到的错误:

SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "$1" 
LINE 4:             
WHEN features $1 'exterior' THEN        

显然是 JSONB 运算符?被误认为是数据绑定项。有没有办法解决?

【问题讨论】:

    标签: php postgresql symfony jsonb dbal


    【解决方案1】:

    有一个bug report,可能会涵盖您的问题。

    您可以尝试那里提到的以下解决方案:

    目前我找到了多种方法 让它工作:

    1. 使用准备好的语句(即使用 :name 或 ? 占位符等)
    2. 将 PDO 标志 PDO::ATTR_EMULATE_PREPARES 设置为 true
    3. 应用 pgsql C-Style 转义语法 1,即 VALUES(E'\'':1)

    关于 2):这适用于简单的情况,但在大的情况下失败了 应用程序,尚未调查原因

    关于 3):还没有深入挖掘这是否会造成更多麻烦

    【讨论】:

    • 第一个选项,如您所见,我已经这样做了,但在内部它被替换为 ?。我希望我能以任何方式逃避 JSONB 运算符......我看看其他两个选项。谢谢!
    猜你喜欢
    • 2015-10-15
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多