Привязка параметров PostgreSQL конфликтует с операторами JSONB - PullRequest
1 голос
/ 22 мая 2019

Я обновляю поле JSONB в своей базе данных postgreSQL (используя 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?ошибочно принимается за элемент привязки данных.Есть ли способ обойти это?

1 Ответ

0 голосов
/ 22 мая 2019

Существует отчет об ошибке , который может охватить вашу проблему.

Вы можете попробовать следующие решения, упомянутые там:

Пока я нашел несколько способов заставить его работать:

  1. использовать подготовленные операторы (т.е. использовать: имя или? Заполнитель и т. Д.)
  2. установить флаг PDO PDO :: ATTR_EMULATE_PREPARES в true
  3. применить pgsql escape-синтаксис в стиле C 1 , т. Е. VALUES (E '\' ': 1)

Около 2): это работало для простых случаев, но не работало в больших приложение, еще не выяснил, почему

О 3): не копайте глубже, может ли это вызвать больше проблем или нет

...