3

我们使用学说 2 并希望编写如下参数化代码:

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

有这样的查询:

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

"color"是属性的自定义(用户选择)名称。所以我觉得quote()屏蔽它是一个合适的功能。但是它用单引号包裹了一个参数,这使得请求语法不正确。

quoteIdentifier()函数用双引号括起来,但我不确定在这种情况下使用它是否正确。

如何构建安全代码来获取我需要的请求?

4

2 回答 2

1

这是一种使用json_build_objectand的方法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 知道参数是字符串还是数字。

于 2019-01-24T19:51:53.350 回答
0

您可以在字符串中包含双引号。

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

不要依赖引用来保证您的安全,而是使用将值绑定到准备好的语句的方法执行查询。

$statement = $con->executeQuery('SELECT * FROM your_table WHERE attributes @> ?', [$attr]);
于 2019-01-24T19:31:52.070 回答