Php 使用交叉表时如何在Postgresql中准备语句
使用Symfony(2.8)和Doctrine,以及Postgresql(9.5)。我需要使用Php 使用交叉表时如何在Postgresql中准备语句,php,postgresql,symfony,doctrine,prepared-statement,Php,Postgresql,Symfony,Doctrine,Prepared Statement,使用Symfony(2.8)和Doctrine,以及Postgresql(9.5)。我需要使用crosstab,使用PHP中准备好的语句来透视我的结果 我的模式不同且复杂,因此,为了简单起见,让我们直接从Postgresql中选取一个示例表: 下面是PHP代码: $sql = "SELECT * from CROSSTAB( 'SELECT year, month, qty FROM sales WHERE year = :year', 'SELECT m FROM genera
crosstab
,使用PHP中准备好的语句来透视我的结果
我的模式不同且复杂,因此,为了简单起见,让我们直接从Postgresql中选取一个示例表:
下面是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
被视为字符串文本的一部分,因此无法绑定它。我该怎么做?有解决办法吗?你说得对。带引号的占位符不是占位符。它们只是字符串的一部分,只是看起来像占位符。而是以片段形式构建字符串文字:
$sql = "select * from crosstab(
'select year, month, qty from sales order by 1 where year = ' + :year,
^^^^^^^^^
附录:由于我在Postgresql中工作,连接需要两个管道符号| |,因此:
$sql=“…交叉表('select…where year='| | |:year,
。进一步补充:如果命名参数将是字符串值,则需要对单引号进行转义。由于这是PHP代码的一部分,三个单引号将完成此操作:$sql=“select*FROM CROSSTAB('…where email='| | | |''ORDER BY…,…)
$sql = "select * from crosstab(
'select year, month, qty from sales order by 1 where year = ' + :year,
^^^^^^^^^