【发布时间】: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::errorInfo 和PDOStatement::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