来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中)
Posted
技术标签:
【中文标题】来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中)【英文标题】:Specific error code from stored procedure with PDO (in Zend Framework 2) 【发布时间】: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。
【问题讨论】:
【参考方案1】:您想要打开$e->errorInfo[1]
,这是驱动程序特定的错误代码(而不是标准化的SQLSTATE
值)。
【讨论】:
天啊!我在调试时看到了这一点,但我被愚弄了,因为它似乎没有getter方法。非常感谢 - 它有效。 :-) @andy124 有一些方法可以获取该数据,但在相关的 PDO 和 PDOStatement 类上,而不是在异常本身上。 @cbuckley 是的,我实际上是在看那些。我的意思是我没有找到异常的getter方法。通过 ZF2 进入这些课程一开始似乎有点令人困惑,所以这种方法似乎更容易。感谢您的提醒 - 我很感激。【参考方案2】:可能对一些身体有帮助-> 有时 try catch 块效率不高read here cmets
和here 解决方案。
【讨论】:
虽然此链接可能会回答问题,但最好包含答案的基本部分here 并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。以上是关于来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中)的主要内容,如果未能解决你的问题,请参考以下文章