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