我正在尝试创建一个Doctrine DBAL querybuilder对象并在其中设置一个参数。 (使用postgres db,dbal 2.3.4,doctrine
$connection = $this->_em->getConnection();
$qb = $connection->createQueryBuilder();
$qb->select('tbl_user_contract.pkid AS pkid');
$qb->from('tbl_user_contract', 'tbl_user_contract');
$qb->join('tbl_user_contract', 'tbl_user', 'tbl_user', 'tbl_user_contract.fk_user = tbl_user.pkid');
$qb->where('tbl_user.pkid = :userid');
$qb->setParameter(':userid', 10);
当我尝试获取此querybuilder对象的结果时,出现以下错误:
SQLSTATE[08P01]: <<Unknown error>>: 7 ERROR: bind message supplies 0 parameters,
but prepared statement "pdo_stmt_00000002" requires 1
当我检查postgres日志时,我看到传递的查询,我注意到它需要一个参数,但我不会传入参数。
我试图在where表达式中设置id(不使用预处理语句),这是有效的。但我真的希望用预先准备好的声明来解决这个问题。
任何人都知道如何解决这个问题?
提前致谢
答案 0 :(得分:5)
我认为您只需要从setparameter
命令
$qb->setParameter('userid', 10);
至少它适用于Doctrine帮助http://docs.doctrine-project.org/en/latest/reference/query-builder.html
答案 1 :(得分:1)
querybuillder函数的setParameter部分是错误的。你不需要:,你可以将它全部放在这样的一行上,并且只在FROM语句中包含一个talbe。如果有另一个名为tbl_user的表,并且需要检查实体定义以确保注释正确,则可能在JOIN或FROM语句中出现问题。
$connection = $this->_em->getConnection();
$qb = $connection->createQueryBuilder();
$qb->select('tbl_user_contract.pkid AS pkid')
->from('tbl_user_contract')
->join('tbl_user_contract', 'tbl_user', 'tbl_user', 'tbl_user_contract.fk_user = tbl_user.pkid')
->where('tbl_user.pkid = :userid')
->setParameter('userid', 10);
答案 2 :(得分:0)
我遇到了与DBAL 2.5.13相同的问题。
我正在编写一个使用Symfony组件和DBAL的工具,因此没有entityManager
对象,但由于团队以前对Symfony的了解而保持类似的结构,我使用如下方法创建了一个存储库类:
public function getAtendimentoRealFromOffline($foo3, $foo4)
{
$query = $this->createQueryBuilder()
->select("foo1, foo2")
->from("bar_table")
->andWhere("foo3 = :foo3")
->andWhere("foo4 = :foo4")
->setParameter(":foo3", $foo3)
->setParameter(":foo4", $foo4);
}
现在如果您运行:
$this->connection->fetchAll($query);
它确实会向您显示错误,因为您使用来自连接的fetchAll与您刚刚使用QueryBuilder
创建的语句完全没有任何关系。一种解决方案是使用第二个参数发送参数数组:
$this->connection->fetchAll($query, ["foo3" => "bar3", "foo4" => "bar4"]);
您可以从查询构建器中删除setParameters
:
$query = $this->createQueryBuilder()
->select("foo1, foo2")
->from("bar_table")
->andWhere("foo3 = :foo3")
->andWhere("foo4 = :foo4")
文档中看不到的是QueryBuilder
实际上有一个执行方法,然后确实会运行参数,因此您可以:
$query->execute()->fetchAll();
答案 3 :(得分:0)
文档指出您可以执行以下操作:
$queryBuilder
->select('id', 'name')
->from('users')
->where('email = ' . $queryBuilder->createNamedParameter($userInputEmail))
;
答案 4 :(得分:0)
尝试一下:
$qb->where('tbl_user.pkid = :userid');
$qb->setParameter(':userid', 10);
然后
$params = $qb->getParameters();
$stmt = $connection->prepare($qb->getSQL());
foreach ($params as $key=>$value){
$stmt->bindParam($key,$value);
}
$stmt->execute();
$result = $stmt->fetchAllAssociative();