我们使用准则2,并希望编写这样的参数化代码:
attributes @> \'{' . $con->quote($attrId) . ':' . (int)$value . '}\'';
具有这样的查询:
WHERE attributes @>'{"color":14}';
"color"
是属性的自定义(用户选择)名称。因此,我认为quote()
是屏蔽它的适当功能。但是它将参数用单引号引起来,这使请求语法不正确。
quoteIdentifier()
函数用双引号引起来,但是我不确定在这种情况下使用它是否正确。
如何构建安全代码来获取我需要的请求?
答案 0 :(得分:1)
这是使用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知道参数是字符串还是数字。
答案 1 :(得分:0)
您可以在字符串中包括双引号。
$attr = '{"' . $attrId . '":' . (int) $value . '}';
不要依赖引用来确保您的安全,而是使用将值绑定到准备好的语句的方法来执行查询。
$statement = $con->executeQuery('SELECT * FROM your_table WHERE attributes @> ?', [$attr]);