【问题标题】:doctrine dbal querybuilder as prepared statement学说 dbal querybuilder 作为准备好的语句
【发布时间】:2013-08-26 06:26:40
【问题描述】:

我正在尝试创建一个 Doctrine DBAL 查询构建器对象并在其中设置一个参数。 (使用 postgres 数据库,dbal 2.3.4,学说

$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(不使用准备好的语句),这很有效。但我真的很想用准备好的语句来解决这个问题。

有人知道怎么解决吗?

提前致谢

【问题讨论】:

  • 您使用? 通配符作为参数,然后尝试按名称设置它。通常你必须使用 either 命名参数或序数位置参数,而不是混合使用两者。也许您需要尝试$qb-&gt;setParameter(1, 10); 之类的东西? (它可能从零开始计数,也可能从一开始计数)。我不使用 Doctrine 或 PHP,所以这是未经测试的。
  • 对不起,将部分代码复制粘贴到 stackoverflow 时出错了。将其更改为两个命名参数,但问题仍然存在。

标签: php postgresql symfony doctrine-orm doctrine


【解决方案1】:

我认为您只需要从 setparameter 命令中删除冒号

$qb->setParameter('userid', 10);

至少它在 Doctrine help https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/query-builder.html 中有效

【讨论】:

  • 这似乎不起作用。当我不使用冒号时出现同样的错误。
【解决方案2】:

您的 querybuilder 函数的 setParameter 部分是错误的。您不需要 :,您可以像这样将其全部放在一行上,并且只在 FROM 语句中包含一个表格。如果存在另一个名为 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);

请参阅此处的文档http://docs.doctrine-project.org/en/latest/reference/query-builder.html#binding-parameters-to-your-query

【讨论】:

    【解决方案3】:

    我在使用 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 from connection 与您刚刚使用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();
    

    【讨论】:

      【解决方案4】:

      文档说明您可以执行以下操作:

      $queryBuilder
          ->select('id', 'name')
          ->from('users')
          ->where('email = ' .  $queryBuilder->createNamedParameter($userInputEmail))
      ;
      

      https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/query-builder.html#binding-parameters-to-placeholders

      【讨论】:

        【解决方案5】:

        试试这个:

        $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();
        

        【讨论】:

          猜你喜欢
          • 2016-08-25
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-24
          • 1970-01-01
          相关资源
          最近更新 更多