我很困惑为什么这不起作用,据我所知,我没有做过与我见过的各种其他例子不同的事。
如果我运行以下代码;
try{
//Set the connection
$db = new PDO($dbcon, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Start Transaction
$db->beginTransation();
//SQL to insert Basic Info
$sql1 = //Insert statement here
$query1 = $db->prepare($sql1);
$query1->execute(array(...));
//Run the SQL commands above
$db->commit();
//Set success message
$return['message'] = 'success';
}
catch(Exception $e) {
$db->rollback();
$return['message'] = "Error: ".$e;
};
//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);
然后我的更新失败了。如果我在没有begin / commit行的情况下运行相同的命令;
try{
//Set the connection
$db = new PDO($dbcon, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//SQL to insert Basic Info
$sql1 = //Insert Statement Here
$query1 = $db->prepare($sql1);
$query1->execute(...));
//Set success message
$return['message'] = 'success';
}
catch(Exception $e) {
$db->rollback();
$return['message'] = "Error: ".$e;
};
//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);
然后插入工作正常。
我已经看过各种exmaples(主要是在这个网站上,但也来自其他各个网站),它们在try catch块之外有$db = new PDO...
和$db->setAttrib...
行(我和#39;尝试了,它没有帮助。)
除此之外,据我所知,我的代码中的所有内容都与其他人的例子排成一行,显然有效。
我对PDO非常陌生,这是我第一次尝试使用beginTransation()
和commit()
。
我还应该指出,在我的示例中,我只添加了一个更新,但实际上在5个不同的表上有5个更新语句,这些都依赖于之前的表更新工作。这就是为什么我想使用begin / commit,因为我相信我可以在我的catch中使用$db->rollback();
来撤消所有错误(至少这是我理解它的方式?)
如果有人能指出我所犯的错误(或者至少指出我正确的方向),我非常喜欢它,因为我确信它们非常明显而我和我#39;我遗漏了一些非常基本的东西!
提前致谢。
修改 我已经编辑了上面的代码,删除了一些我不认为其他人需要查看的信息(例如我的数据库连接详细信息以及使用的确切插入语句)。
答案 0 :(得分:0)
我发现了一些更多的例子,经过大量的讨论后,我现在得到了一段可行的代码(注意我已经删除了下面代码中的实际插入语句)。
我不知道发生了什么变化,因为我确定我以前尝试过这种布局,但是我愿意假设我的代码中最初有拼写错误,在我的各种试验中,我设法纠正了。
完整的代码布局(如上所述删除了实际的陈述)是;
//Set the connection
$db = new PDO($dbcon, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try{
//Start Transaction
$db->beginTransaction();
//SQL to insert Basic Info
$sql1 = //Insert Statement Here
$query1 = $db->prepare($sql1);
$query1->execute(); //With parameters
//Set member_id variable
$member_id = $db->lastInsertId();
//SQL to insert Address Info
$sql2 = //
$query2 = $db->prepare($sql2);
$query2->execute(); //With parameters
//SQL to insert Medical Info
$sql3 =
$query3 = $db->prepare($sql3);
$query3->execute(); //With parameters
//SQL to insert Ethnicity and Disability Info
$sql4 =
$query4 = $db->prepare($sql4);
$query4->execute(); //With parameters
//SQL to insert Declaration Info
$sql5 =
$query5 = $db->prepare($sql5);
$query5->execute(); //With parameters
//Run the SQL commands above
$db->commit();
//Set success message
$return['message'] = 'Database Updated Correctly';
}catch (PDOException $exception){
$db->rollBack();
$return['message'] = 'Fail: '.$exception;
};
//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);
有趣的是rollBack();
在这个例子中并不起作用,但是如果我无法解决这个问题,那将是另一个问题。 (顺便说一句,如果我确定rollback();
为什么不起作用,我会为将来的访问者更新此答案)!