存储过程与PDO的特定错误代码(在Zend Framework 2中)

And*_*708 4 php mysql pdo stored-procedures zend-framework2

我试图在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我希望能够确切地检查发生了哪个错误.但问题是,抛出的异常的错误代码为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);
}
Run Code Online (Sandbox Code Playgroud)

PDOException在我的案例中,这里包含错误代码23000.该null参数是错误代码.所以在我的catch块中,我实际上将捕获InvalidQueryException一个错误代码为0,这不是那么有用.此异常确实为我提供了对先前异常(上面的最后一个参数)的访问,这将是PDOException,如下所示:

// try block omitted
catch (InvalidQueryException $e) {
    $previous_exception_error_code = $e->getPrevious()->getCode();
}
Run Code Online (Sandbox Code Playgroud)

在重复条目(1062)上,错误代码是23000.对于"不能添加或更新子行"(1452),它也将是23000.因此我不确定如何在我的应用程序中区分它们.如果我想为这两个错误向用户显示不同的错误消息,该怎么办?异常消息是:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'user' for key 'username'.但这是一个字符串,因此搜索错误代码太过于苛刻.我希望能够从我使用PDO作为具体实现这一事实中抽象出来.

最后,这似乎更多的是关于PDO和MySQL而不是ZF2.我不确定从哪里开始,所以任何关于如何区分错误代码的想法都将非常感激.也就是说,知道何时发生错误1062或1452而不是仅仅23000.

egg*_*yal 6

您想要打开$e->errorInfo[1],这是特定于驱动程序的错误代码(而不是标准化SQLSTATE值).