Избегайте литерала, чтобы он был заключен в двойные кавычки - PullRequest
0 голосов
/ 24 января 2019

Мы используем доктрину 2 и хотим написать параметризованный код, подобный этому:

attributes @> \'{' . $con->quote($attrId) . ':' . (int)$value . '}\'';

, чтобы запрос был таким:

WHERE attributes @>'{"color":14}';

"color" - это пользовательский (пользовательскийвыбрано) имя атрибута.Поэтому я чувствую, что quote() - подходящая функция для ее защиты.Но он заключает параметр в одинарные кавычки, что делает синтаксис запроса неверным.

quoteIdentifier() функция заключает в двойные кавычки, НО я не уверен, правильно ли использовать его вв этом контексте.

Как создать безопасный код для получения нужного мне запроса?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вот способ сделать это с json_build_object и pg_exec_params:

<?php
$dbconn = pg_connect('');
$data = 'some"th\'ing';
pg_query_params($dbconn, 'SELECT json_build_object($1::text, $2::integer)', [$data, 14]);
?>

Вам нужно явное приведение типов, чтобы PostgreSQL знал, является ли аргумент строкой или числом.

0 голосов
/ 24 января 2019

Вы можете включить двойные кавычки в строку.

$attr = '{"' . $attrId . '":' . (int) $value . '}';

Не используйте кавычки для обеспечения вашей безопасности, вместо этого выполните запрос с помощью метода, который связывает значение с подготовленным оператором.

$statement = $con->executeQuery('SELECT * FROM your_table WHERE attributes @> ?', [$attr]);
...