Php 将参数添加到pg_query_params数组会产生错误

Php 将参数添加到pg_query_params数组会产生错误,php,postgresql,Php,Postgresql,这项工作: $entriesResult = pg_query_params(" SELECT * FROM crosstab( $$ SELECT entry_id, field_id, COALESCE(d.data, f.default_val) AS data FROM entry e JOIN field f USING (section_id) LEFT JOIN data d USING (field_id, en

这项工作:

$entriesResult = pg_query_params("
SELECT * FROM crosstab(
    $$
    SELECT entry_id, field_id, COALESCE(d.data, f.default_val) AS data
    FROM   entry     e
    JOIN   field     f USING (section_id)
    LEFT   JOIN data d USING (field_id, entry_id)
    WHERE  e.section_id = 1 AND f.aggregate = 1 AND f.enabled = 1 AND f.deleted = 0
    ORDER  BY 1, 2
    $$
    ,
    $$
    SELECT field_id FROM field WHERE section_id = 1 AND aggregate = 1 AND enabled = 1 AND deleted = 0 ORDER BY rank
    $$
)
AS ct (entry_id int $fieldPrefixString)
ORDER  BY f1->>'value' DESC
", array());
这将产生以下错误:bind消息提供1个参数,但准备好的语句“”需要0

$entriesResult = pg_query_params("
SELECT * FROM crosstab(
    $$
    SELECT entry_id, field_id, COALESCE(d.data, f.default_val) AS data
    FROM   entry     e
    JOIN   field     f USING (section_id)
    LEFT   JOIN data d USING (field_id, entry_id)
    WHERE  e.section_id = $1 AND f.aggregate = 1 AND f.enabled = 1 AND f.deleted = 0
    ORDER  BY 1, 2
    $$
    ,
    $$
    SELECT field_id FROM field WHERE section_id = $1 AND aggregate = 1 AND enabled = 1 AND deleted = 0 ORDER BY rank
    $$
)
AS ct (entry_id int $fieldPrefixString)
ORDER  BY f1->>'value' DESC
", array(3));
区别在于我在第二个非工作示例中使用了数组参数。我猜这和使用交叉表有关?如何使用pg_query_参数实现此功能


作为最后手段,我可以使用pg_escape_id,但这并不理想。

这与
交叉表
没有直接关系,而是与
$1
没有被插入到文字字符串中有关。写下以下内容时会出现相同的错误:

pg_query_params('SELECT $$ $1 $$', array(3));
$N
参数必须独立存在,就像它们是表达式一样

因此,可以这样写,仍然使用$$样式的引用:

$entriesResult = pg_query_params("
SELECT * FROM crosstab(
    $$
    SELECT entry_id, field_id, COALESCE(d.data, f.default_val) AS data
    FROM   entry     e
    JOIN   field     f USING (section_id)
    LEFT   JOIN data d USING (field_id, entry_id)
    WHERE  e.section_id = $$ || cast($1 as text) || $$ AND f.aggregate = 1 AND f.enabled = 1 AND f.deleted = 0
    ORDER  BY 1, 2
    $$
    ,
    $$
    SELECT field_id FROM field WHERE section_id = $$ || cast($1 as text) || $$ AND aggregate = 1 AND enabled = 1 AND deleted = 0 ORDER BY rank
    $$
)
AS ct (entry_id int $fieldPrefixString)
ORDER  BY f1->>'value' DESC
", array(3));

在此版本中,
$1
将被解析为SQL级别的参数。我使用显式cast
cast($1作为文本)
,因为无论参数最初是什么类型,它都不会让参数变成字符串。非常感谢你。