为什么下面的PDO事务不会在PHP中起作用?

时间:2013-06-29 22:18:37

标签: php mysql pdo transactions innodb

我正在使用PHP版本5.4.4,以及使用InnoDB的MySQL数据库。我一直在使用PDO一段时间没有使用交易,一切都运行得很完美。然后,我决定尝试实现事务,并且我一直收到内部服务器错误500.以下代码适用于我(不包含事务)。

try {
    $DB = new PDO('mysql:host=localhost;dbname=database', 'root', 'root');
    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbh = $DB->prepare("SELECT * FROM user WHERE username = :test");

    $dbh->bindValue(':test', $test, PDO::PARAM_STR);

    $dbh->execute();
}
catch(Exception $e) {
    $dbh->rollback();
    echo "an error has occured";
}

然后我尝试使用以下代码的事务(这不起作用)。

try {
    $DB = new PDO('mysql:host=localhost;dbname=database', 'root', 'root');
    $DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $dbh = $DB->beginTransaction();

    $dbh->prepare("SELECT * FROM user WHERE username = :test");

    $dbh->bindValue(':test', $test, PDO::PARAM_STR);

    $dbh->execute();

    $dbh->commit();
}
catch(Exception $e) {
    $dbh->rollback();
    echo "an error has occured";
}

当我运行上一代码时,我收到内部服务器错误500.

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

$DB->beginTransaction返回boolean,它不会返回您的数据库处理程序(如在预准备语句对象中)..

使用$dbh = $DB->prepare代替。您可以使用$DB->beginTransaction的返回值来检查事务是否已成功启动(它将关闭自动提交模式)。

答案 1 :(得分:0)

您需要引用数据库连接句柄,而不是beginTransaction方法的返回值。您将返回值分配给$ dbh。不需要$ dbh。您需要使用$ DB变量,然后在PDO语句周围声明beginTransaction / commit。

//start transaction, reference PDO handle
$DB->beginTransaction();

//In between your beginTransaction and Commit is where you will put all of your
// statements.
$DB->prepare(...);
$DB->bindValue(...);

$DB->execute();

//commit your statements once done.
$DB->commit();