php - 来自带有 PDO 的存储过程的特定错误代码(在 Zend Framework 2 中)

标签 php mysql stored-procedures pdo zend-framework2

我正在尝试启动并运行 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/

相关文章:

javascript - 使用 Ajax 和 PHP 将文件上传到数据库

javascript - 具有相同类别的每个 div 的随机背景图像

php - 我们可以使用表来回显两个不同查询调用的数据吗?

php - 如何显示Mysql php结果json格式?

php - 无法识别我在 PHP 中进行的查询中的 MySQL 错误

mysql - 如何检查日期是否在 MySQL 的范围内?

oracle - 删除 PL SQL 中的语句

php - 从数据库中提取时避免特定值的最佳方法?

java - 在sql server 2008中调用带有表类型输入参数的存储过程

mysql - 如何在kitura应用程序中调用mysql存储过程