我有点困惑为什么这不起作用,据我所知,我没有做任何与我见过的其他例子不同的事情。
如果我运行以下代码;
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);
然后我的更新失败了。如果我在没有开始/提交行的情况下运行相同的命令;
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);
然后插入就可以正常工作了。
我见过各种例子(主要在这个网站上,但也来自其他各个网站),其中有 $db = new PDO...
和 $db-> setAttrib...
try catch block 之外的行(我已经尝试过,但没有帮助)。
除此之外,据我所知,我的代码中的所有内容都与其他人的示例一致,这显然是有效的。
我对 PDO 非常陌生,这是我第一次尝试使用 beginTransation()
和 commit()
。
我还应该指出,在我的示例中,我只添加了单个更新,但实际上在 5 个不同的表上有 5 个更新语句,这些语句都依赖于之前的表更新工作。这就是为什么我想使用 begin/commit,因为我相信我可以在 catch 中使用 $db->rollback();
在发生错误时撤消所有内容(至少是这样)我明白了??)
如果有人能够指出我所犯的错误(或者至少指出我正确的方向),我非常希望,因为我确信它们非常明显,而我错过了一些非常基本的东西!
提前致谢。
编辑 我编辑了上面的代码,删除了一些我认为其他人不需要看到的信息(例如我的数据库连接详细信息以及正在使用的确切插入语句)。
最佳答案
我找到了更多示例,经过一番折腾后,我现在得到了一段可以运行的代码块(请注意,我已经删除了下面代码中的实际插入语句)。
我不知道发生了什么变化,因为我确信我以前尝试过这种布局,但我愿意假设我的代码最初有一个拼写错误,我已经设法在我的代码中纠正了这个错误。各种尝试。
完整的代码布局(如上所述删除了实际语句)是;
//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();
不起作用,我将为 future 的访问者更新此答案)!
关于php - 尝试使用 beginTransaction() 和 commit() 但当我将命令放入时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569141/