-2

我正在使用 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。

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

4

2 回答 2

1

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

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

于 2013-06-30T15:06:01.577 回答
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();
于 2014-07-15T03:31:49.547 回答