【发布时间】:2013-01-05 02:10:55
【问题描述】:
我正在尝试使用 Zend Framework 2 中的存储过程来启动和运行。我尝试在存储过程中使用 return an error code with an out parameter,但我无法完成这项工作。然后我想,当发生错误时,我可以在 PHP 中捕获一个异常。问题是我似乎无法访问 specific 错误代码 - 只有一般错误代码(例如 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,而不是上述之一。
InvalidQueryException 在第 220 行被抛出 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 块中,我实际上会捕获一个错误代码为 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。
【问题讨论】:
标签: php mysql stored-procedures pdo zend-framework2