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

时间:2014-07-16 20:11:18

标签: php mysql stored-procedures pdo

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

当我通过命令行调用其中一个存储过程然后调用SHOW ERRORS时,我得到一个包含错误状态,代码和消息的好结果集,但如果我在执行存储过程后调用PDO中的SHOW ERRORS,我得到没有结果。如果我在存储过程中调用show errors,我也无法在命令行中看到SHOW ERRORS的结果。

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

我可以使用其他选项或我应该采取的其他途径吗?

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

BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
END;

SELECT *
FROM bunnies;
END

更新:我的PHP代码在一个对象中,所以我复制并简化了代码以发布每个Barmar的请求,当我尝试简化代码时,我发现SHOW ERRORS确实可以与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;

1 个答案:

答案 0 :(得分:0)

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