使用Symfony (2.8)和Doctrine,以及Postgresql (9.5)。我需要在crosstab中使用预准备语句来透视我的结果。
我的模式是不同的和复杂的,为了简单起见,我们直接从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被认为是字符串文字的一部分,因此无法绑定它。我该怎么做呢?有解决办法吗?
发布于 2016-08-30 00:28:55
你是对的。带引号的占位符不是占位符。它们只是字符串的一部分,看起来只是占位符。改为以片段形式构建字符串文字:
$sql = "select * from crosstab(
'select year, month, qty from sales order by 1 where year = ' + :year,
^^^^^^^^^https://stackoverflow.com/questions/39210892
复制相似问题