我正在使用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.
任何帮助将不胜感激!谢谢!
答案 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();