【问题标题】:PHP PDO & transactions - different behavior on PHP 5.4 and PHP 5.2.13PHP PDO 和事务 - PHP 5.4 和 PHP 5.2.13 上的不同行为
【发布时间】:2012-05-21 19:29:24
【问题描述】:

以下代码在 PHP 5.4 和 5.2.13 之间是否存在显着差异?它适用于 PHP 5.4 (& mysql 5.1.62),不显示错误并执行查询。但是对于 5.2.13 (& mysql 5.1.3.0) 它不会显示任何错误(它不会落入 catch 块)但数据不会插入到数据库中

 $db = new PDO(DHOST, DUSER, DPASS, array(PDO::ATTR_PERSISTENT => true, PDO::ATTR_EMULATE_PREPARES => true));
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

 try {
        $db->beginTransaction();
        $db->exec($insertString);
        $db->commit();
    } catch (Exception $e) {
        try {
            $db->rollBack();
            throwDbError($handler->errorInfo());
        } catch (Exception $e2) {
            ...
        }
    }

如果我省略了beginTransactioncommit 的行,它也适用于 PHP 5.2,但我需要事务。 mysql 数据库中的两个表都在使用 InnoDB

【问题讨论】:

  • DB_DAO::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 这一行看起来很可疑。 5.4 可能是使用异常错误模式吗?
  • 对不起,旧代码片段

标签: php pdo php-5.2


【解决方案1】:

你应该抓住PDOException,而不是Exception

【讨论】:

  • 所有异常类都派生自Exception
  • @Narf 虽然这可能会更好,但它并不能解决发现的问题。
【解决方案2】:

错误模式未设置为抛出异常。变化:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

收件人:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

两个 PHP 版本之间应该没有明显的区别。

【讨论】:

  • 谢谢,之后我得到“PDO 异常:在其他无缓冲查询处于活动状态时无法执行查询”。不知道有什么区别,但至少我找到了问题并采取了一些解决方法
  • 它所链接的 mysqlclient 库可能有所不同。不确定,但我很高兴你找到了解决方法:)
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 2012-10-19
  • 2016-07-29
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
相关资源
最近更新 更多