我正在尝试启动并运行 Zend Framework 2 中的存储过程。我尝试了 return an error code with an out parameter在存储过程中,但我一直无法完成这项工作。然后我想当发生错误时,我可以在 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 行的 Zend\Db\Adapter\Driver\Pdo\Statement
中抛出了一个 InvalidQueryException
:
try {
$this->resource->execute();
} catch (\PDOException $e) {
throw new Exception\InvalidQueryException('Statement could not be executed', null, $e);
}
在我的例子中,PDOException
包含错误代码 23000。 null
参数是错误代码。因此,在我的 catch block 中,我实际上将捕获错误代码为 0 的 InvalidQueryException
,这并不是那么有用。这个异常确实让我可以访问以前的异常(上面的最后一个参数),这将是 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。
最佳答案
您想打开 $e->errorInfo[1]
,它是特定于驱动程序的错误代码(而不是标准化的 SQLSTATE
值)。
关于php - 来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14448519/