MySQL在执行存储过程后调用SHOW ERRORS


MySQL call SHOW ERRORS after executing a stored procedure

我有几个存储过程,我在PHP中通过PDO调用。我希望能够通过执行ROLLBACK来处理错误,但是我仍然希望能够使用PHP来检索和处理过程中的最后一个错误。我已经尝试使用PDO::errorCode()和PDO::errorInfo(),但这似乎是一个合法的解决方案,我认为因为我已经在处理我的存储过程中的错误。

当我通过命令行调用其中一个存储过程,然后调用SHOW ERRORS时,我得到了一个包含错误状态、代码和消息的不错的结果集,但是如果我在执行存储过程后在PDO中调用SHOW ERRORS,我就得不到任何结果。如果在存储过程中调用SHOW ERRORS,命令行中的SHOW ERRORS也不会得到任何结果。

我会使用GET诊断,但是我正在开发的MySQL服务器是在托管的cPanel上,我无法控制更新,它是5.5版本。

我可以使用其他选项或我应该走其他路线吗?

就像我说的,我有几个存储过程,我想处理错误,但我甚至不能让它在一个简单的存储过程上工作:

BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
END;
SELECT *
FROM bunnies;
END

Update:我的PHP代码是在一个对象中,所以我复制并简化了代码以发布每个Barmar的请求,当我尝试简化代码时,我发现SHOW错误确实与PDO一起工作,当准备和执行函数后准备和执行。

我的对象有点复杂(我写它的时候我还不太了解PHP OOP),所以我也简化了它,现在它可以工作了!我认为连接在调用之间被关闭,现在代码更简单了,我在其中调用SHOW ERRORS没有问题。

下面是我用来测试的简化PHP代码,以防有人在使用它时遇到问题:

    $host = '***';
    $user = '***';
    $pass = '***';
    $schema = '***';
    $connection = new PDO('mysql:host=' . $host . ';dbname=' . $schema . ';', $user, $pass);
    $statement = $connection->prepare('CALL test()');
    $statement->execute();
    $statement = $connection->prepare('SHOW ERRORS');
    $statement->execute();
    echo var_dump($statement->fetchAll());
    $statement = null;
    $statement = null;
    $connection = null;

确保使用相同的PDO连接对象来执行原始查询和检索错误。每个连接都有自己的错误状态