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级别的参数。我使用显式castcast($1作为文本)
,因为无论参数最初是什么类型,它都不会让参数变成字符串。非常感谢你。