2013-06-29 34 views
-2

我使用的是PHP 5.4.4版本,以及使用InnoDB的MySQL数据库。我一直在使用PDO而不使用交易,并且一切都完美无瑕。然后,我决定尝试实现事务,并且不断收到内部服务器错误500.以下代码适用于我(不包含事务)。为什么下面的PDO事务不能在PHP中工作?

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

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

+0

什么版本的MySQL和事务处于启用状态?我有一个主机ISP拥有正确版本的MySQL,但由于某种原因禁用了事务。 – Revent

+0

检查您的错误日志。什么是错误? – Ryan

+0

'beginTransaction'返回一个'boolean',它不会返回你的数据库处理程序..使用'$ dbh = $ DB-> prepare'来代替..真的让所有的人都下来投票,但不会告诉为什么.. – dbf

回答

1

$DB->beginTransaction返回boolean,它不会返回你的数据库处理(如在一份声明对象)..

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

+0

哦哇,一个倒票,关心评论你的问题是什么? – dbf

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(); 
相关问题