【问题标题】:PHP PDO insert using transaction doesn't show error使用事务的 PHP PDO 插入不显示错误
【发布时间】:2014-08-23 22:18:15
【问题描述】:

我有这个代码:

$Pdo = new PDO('pgsql:host=localhost;port=5432;dbname=mydb', 'user', 'password');

$options = = array(
    PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_CURSOR           => PDO::CURSOR_FWDONLY,
    PDO::ATTR_EMULATE_PREPARES => false
);

$sql = 'INSERT INTO my_table (
            field_a,
            field_b
        ) VALUES (
            :field_a,
            :field_b
        )';

$Pdo->beginTransaction();

$Ps = $Pdo->prepare($sql, $options);

$Ps->execute(array(
    ':field_a' => 'Field A',
    ':field_b' => 'Field B',
    ':field_c' => 'Field C'
));

$Pdo->commit();

$Ps-execute() 返回false,但不会显示错误消息,指出列数多于指定的 SQL 中的列数。

在我的真实案例中,我有多个 SQL 语句,因此我使用的是事务。

有人知道怎么解决吗?

【问题讨论】:

  • 您有 field_a,field_b 并在您的值中绑定了两个。然后,您将执行三个之后。没有field_c吗?
  • 您是否尝试在查询失败后调用PDOStatement::errorInfoPDOStatement::errorCode
  • @Fred-ii-,我是故意这样做的,我试图强制 PHP 触发异常而不是 execute() return false
  • @HorusKol,是的,它有效,但我试图强制 PHP 触发异常或错误
  • 好吧,那我看错了。您是否尝试过(try/catch 方法)try { $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e){ $e->getMessage(); } - 这当然是一个示例。

标签: php sql postgresql pdo transactions


【解决方案1】:

目前,我找到的唯一解决方案是:

$Pdo->beginTransaction();

$Ps = $Pdo->prepare($sql, $options);

if( ! $Ps->execute(array(
    ':field_a' => 'Field A',
    ':field_b' => 'Field B',
    ':field_c' => 'Field C'
))){
    throw new Exception('Transaction failed: ' . implode(' | ', $Ps->errorInfo()));
}

$Pdo->commit();

【讨论】:

  • 如果这行得通,那就太好了。有趣的是,我在考虑“交易”,我应该遵循我的直觉;-)
  • @Fred-ii-, I opened a ticket in PHP.net,让我们看看这是错误还是正常行为。
猜你喜欢
  • 2015-04-17
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2016-03-27
  • 2012-12-10
  • 1970-01-01
相关资源
最近更新 更多