来自带有 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 中)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 调用带有 Out 参数的存储过程

事务、存储过程和 PDO

带有条件检查的 PHP MySQL PDO TextArea Where 子句

来自存储过程的php PDO结果为空

PDO 存储过程返回值

从 PHP PDO 调用 SQL 存储过程