教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配

Posted

技术标签:

【中文标题】教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配【英文标题】:Doctrine, subquery, Invalid parameter number: number of bound variables does not match number of tokens 【发布时间】:2015-07-14 18:15:08 【问题描述】:

当我在 select 子句的子查询中使用命名参数时,我收到此错误:

无效的参数号:绑定变量的数量与标记的数量不匹配

如果我使用 QueryBuilder 重写查询,这个错误可能会消失。但我喜欢用我的风格来看待 DQL 语句:

$dql = 'SELECT u,
            (SELECT count(e1.id)
               FROM FrontendBundle:Entrega e1
               JOIN e1.usuario u1 
              WHERE u1.id = u.id
                AND e1.programa = :programaId) AS numentregas

          FROM FrontendBundle:Usuario u
          WHERE EXISTS (SELECT mat FROM FrontendBundle:Matricula mat
                            WHERE mat.centro = :centroId
                            AND mat.usuario = u.id)
         ';

$consulta = $this->getEntityManager()->createQuery($dql);

$consulta->setParameter('programaId', $programaId);
$consulta->setParameter('centroId', $centroId);

我总是使用这种代码结构。但在这种情况下,当我在选择子查询中使用“:programaId”时,我得到了错误。

但是,令人惊讶的是,where-subselect 中的 ":centroId" 有效。

不要试图分析完整的选择,我已经删除了一些不重要的部分。 谢谢

【问题讨论】:

DQL 有效。教义支持在“选择部分”和“位置部分”中进行子选择。问题是setParameter。当参数位于“where exists (select ... :param)”部分时,它可以工作。但是在“Select (select ... :param)... FROM ...”中不起作用。无论如何,我仍然使用字符串格式化来解决这个问题。 【参考方案1】:

如果你想在不使用查询生成器的情况下运行查询,我建议使用 php 内置的 PDO:

http://php.net/manual/en/book.pdo.php

try 
    $sql = 'SELECT u,
            (SELECT count(e1.id)
               FROM FrontendBundle:Entrega e1
               JOIN e1.usuario u1
              WHERE u1.id = u.id
                AND e1.programa = :programaId) AS numentregas
            FROM FrontendBundle:Usuario u
           WHERE EXISTS (SELECT mat FROM FrontendBundle:Matricula mat
                            WHERE mat.centro = :centroId
                            AND mat.usuario = u.id)';

    $sth = $this->getEntityManager()->getConnection()->prepare($sql);
    $sth->bindParam(':programaId', $programaId);
    $sth->bindParam(':centroId', $centroId);

    $sth->execute();

    return $sth->fetchAll();
 catch (\PDOException $e) 
    return false;

【讨论】:

以上是关于教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配的主要内容,如果未能解决你的问题,请参考以下文章

教义 setParameter 和无效参数号

PDO 更新错误无效参数号:绑定变量的数量与令牌的数量不匹配

使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配

SQL 错误 PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 绑定变量的数量与中的标记数量不匹配

mysqli_stmt_bind_param():变量的数量与绑定参数中准备好的语句中的参数数量不匹配

如何在教义中进行子查询并将结果水合到对象中?