我有几个存储过程,我通过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;
答案 0 :(得分:0)
确保使用相同的PDO连接对象来执行原始查询并检索错误。每个连接都有自己的错误状态。