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

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

使用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 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,
                                                                ^^^^^^^^^