4

我正在尝试使用 Zend Framework 2 中的存储过程启动并运行。我试图在存储过程中返回带有 out 参数的错误代码,但我无法完成这项工作。然后我想,当发生错误时,我可以在 PHP 中捕获一个异常。问题是我似乎无法访问特定的错误代码 - 只有一般错误代码(例如 23000 - 违反完整性约束)。这是我想做的(或类似的)示例:

try {
    $result = $this->dbAdapter->query('CALL sp_register_user(?, ?)', array('username', 'password'));
}

catch (\Exception $e) {
    switch ($e->getCode()) {
        case 1062:
            // Duplicate entry
            break;

        case 1452:
            // Cannot add or update a child row
            break;
    }
}

也就是说,我希望能够准确检查发生了哪个错误。但是,问题在于抛出的异常的错误代码为 23000 而不是上述之一。

在第 220 行InvalidQueryException抛出一个:Zend\Db\Adapter\Driver\Pdo\Statement

try {
    $this->resource->execute();
} catch (\PDOException $e) {
    throw new Exception\InvalidQueryException('Statement could not be executed', null, $e);
}

在我的情况下,PDOException此处包含错误代码 23000。null参数是错误代码。所以在我的 catch 块中,我实际上会捕获InvalidQueryException一个错误代码为 0 的错误代码,这并不是那么有用。这个异常确实让我可以访问以前的异常(上面的最后一个参数),这将是PDOException,如下所示:

// try block omitted
catch (InvalidQueryException $e) {
    $previous_exception_error_code = $e->getPrevious()->getCode();
}

在重复条目 (1062) 上,错误代码为 23000。对于“无法添加或更新子行”(1452),它也是 23000。因此我不确定如何在我的应用程序中区分它们。如果我想针对这两个错误向用户显示不同的错误消息怎么办?异常消息是:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user' for key 'username'。但是,这是一个字符串,因此搜索错误代码太麻烦了。我希望仍然能够从我使用 PDO 作为具体实现的事实中抽象出来。

最后,这似乎更多地是关于 PDO 和 MySQL,而不是 ZF2。我不太确定从这里去哪里,所以任何关于我如何区分错误代码的想法都将不胜感激。也就是说,要知道何时发生错误 1062 或 1452 而不仅仅是 23000。

4

2 回答 2

6

您想要打开$e->errorInfo[1],这是特定于驱动程序的错误代码(而不是标准化SQLSTATE值)。

于 2013-01-21T22:46:33.783 回答
0

可能会对一些身体有所帮助->有时try catch块效率不高,请阅读此处的评论

这里的解决方案。

于 2013-11-30T20:07:00.570 回答