【问题标题】:PDO General Error using Doctrine DBAL in PPI Framework在 PPI 框架中使用 Doctrine DBAL 的 PDO 一般错误
【发布时间】:2012-01-31 12:27:45
【问题描述】:

在运行准备好的语句来更新表行时,我收到“HY000 一般错误”。查询似乎正在运行,并且该行已成功更新。我的代码和返回的错误详述如下。如果有人能指出我解决此问题的正确方向,我将不胜感激。

代码示例:

$query = 'UPDATE users SET active = 1 WHERE email = ? AND activationCode = ?';

$stmt = $this->ds->prepare($query);
$stmt->bindValue(1, $email);
$stmt->bindValue(2, $code);
$stmt->execute();

$row = $stmt->fetch();

错误详情:

File: C:\apache2\htdocs\ppi-framework\Vendor\Doctrine\Doctrine\DBAL\Statement.php
Line: 189
Message: SQLSTATE[HY000]: General error
Code: HY000

【问题讨论】:

    标签: php doctrine pdo dbal ppi


    【解决方案1】:

    是的,fetch() 期待来自 SELECT 的结果,这不是您的查询正在执行的。

    我建议您使用 PPI\DataSource\ActiveQuery 组件,而不是通过 PPI 的 DataSource 组件直接与 PDO 交互。这会在后台执行相关的 PDO 代码,这当然是由 Doctrine DBAL(PPI 框架正在抽象)执行的。

    以下是如何使用 PPI 的 ActiveQuery 类的示例。

    <?php
    namespace App\Model;
    class User extends \PPI\DataSource\ActiveQuery {
    
        protected $_meta = array(
            'table'   => 'users',
            'primary' => 'id',
            'conn'    => 'main' // See your connections.php configuration
        );
    }
    

    这就是您所需要的,现在 PPI 可以为您完成剩下的工作。要更新查询,您可以执行以下操作:

    <?php
    $model  = new \App\Model\User();
    $data   = array('active' => 1);
    $where  = array('email' => 'x', 'activationCode' => 'x');
    $result = $model->update($data, $where);
    

    要查看 ActiveQuery->update() 发生了什么,您可以从此处开始跟踪: https://github.com/ppi/framework/blob/master/PPI/DataSource/PDO/ActiveQuery.php#L127

    祝你好运。

    保罗·德拉戈尼斯。

    【讨论】:

      【解决方案2】:

      您正在执行更新语句,然后尝试从结果集中获取一行(即为空)。这就是你得到异常的地方。

      删除提取,你就可以开始了。

      【讨论】:

      • 谢谢,玛琳。第二双眼睛让一切变得不同。我应该打电话给 $stmt->rowCount()
      猜你喜欢
      • 2015-06-13
      • 2011-07-15
      • 2013-06-20
      • 1970-01-01
      • 2011-10-07
      • 2017-02-25
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多