gpt4 book ai didi

php - 使用交叉表时如何在 Postgresql 中准备语句

转载 作者:搜寻专家 更新时间:2023-10-31 21:02:32 24 4
gpt4 key购买 nike

使用 Symfony (2.8) 和 Doctrine,以及 Postgresql (9.5)。我需要使用 crosstab 在 PHP 中使用准备好的语句来转换我的结果。

我的架构不同且复杂,因此,为了简单起见,让我们直接从 Postgresql 的 documentation 中获取一个示例表。 :

CREATE TABLES sales(year int, month int, qty int);
INSERT INTO sales VALUES(2007, 1, 1000);
INSERT INTO sales VALUES(2007, 2, 1500);
INSERT INTO sales VALUES(2007, 7, 500);
INSERT INTO sales VALUES(2007, 11, 1500);
INSERT INTO sales VALUES(2007, 12, 2000);
INSERT INTO sales VALUES(2008, 1, 1000);

现在,这是 PHP 代码:

$sql = "SELECT * from CROSSTAB(
'SELECT year, month, qty FROM sales WHERE year = :year',
'SELECT m FROM generate_series(1,12) m'
) as (
year int,
\"Jan\" int,
\"Feb\" int,
\"Mar\" int,
\"Apr\" int,
\"May\" int,
\"Jun\" int,
\"Jul\" int,
\"Aug\" int,
\"Sep\" int,
\"Oct\" int,
\"Nov\" int,
\"Dec\" int
);";

$statement = $conn->prepare($sql);
$params = ['year' => 2008];

$statement->execute($params);

执行这个会抛出一个错误:

SQLSTATE[HY093]: Invalid parameter number: :year

我认为这可能是因为 :year 被视为字符串文字的一部分,因此无法绑定(bind)它。我如何使这项工作?有解决方法吗?

最佳答案

你是对的。引用占位符不是占位符。它们只是字符串的一部分,只是看起来像占位符。改为分段构建字符串文字:

$sql = "select * from crosstab(
'select year, month, qty from sales order by 1 where year = ' + :year,
^^^^^^^^^

关于php - 使用交叉表时如何在 Postgresql 中准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com