我正在尝试使用 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。