教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配
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;
【讨论】:
以上是关于教义,子查询,无效参数号:绑定变量的数量与标记的数量不匹配的主要内容,如果未能解决你的问题,请参考以下文章
PDO 更新错误无效参数号:绑定变量的数量与令牌的数量不匹配
使用自定义 PDO 函数时,绑定变量的数量与标记的数量不匹配
SQL 错误 PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 绑定变量的数量与中的标记数量不匹配