【发布时间】:2011-12-23 16:53:24
【问题描述】:
我正在尝试使用 PHP/PDO 在 MySQL 中设置我的第一个事务...
我有一个小问题,确定上一个查询是否成功的最佳方法是什么?这是我现在所拥有的,但我宁愿找到一种方法来使用 if 语句测试查询。
这几乎是模拟代码,试图获得一个工作模型。我知道 $results 没有有效地测试任何东西是好是坏。我把它作为真正交易的占位符时间到了。。
if ($_POST['groupID'] && is_numeric($_POST['groupID'])) {
$sql = "SET AUTOCOMMIT=0";
$dbs = $dbo->prepare($sql);
$dbs->execute();
$sql = "START TRANSACTION";
$dbs = $dbo->prepare($sql);
$dbs->execute();
$sql = "DELETE FROM users_priveleges WHERE GroupID=:groupID";
$dbs = $dbo->prepare($sql);
$dbs->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$dbs->execute();
try {
$sql = "DELETE FROM groups WHERE GroupID=:groupID LIMIT 1";
$dbs = $dbo->prepare($sql);
$dbs->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$dbs->execute();
$results["error"] = null;
$results["success"] = true;
try {
$sql = "DELETE FROM users WHERE Group=:groupID";
$dbs = $dbo->prepare($sql);
$dbs->bindParam(":groupID", $_POST['groupID'], PDO::PARAM_INT);
$dbs->execute();
$results["error"] = null;
$results["success"] = true;
$sql = "COMMIT";
$dbs = $dbo->prepare($sql);
$dbs->execute();
}
catch (PDOException $e) {
$sql = "ROLLBACK";
$dbs = $dbo->prepare($sql);
$dbs->execute();
$results["error"] = "Could not delete associated users! $e";
$results["success"] = false;
}
}
catch (PDOException $e)
{
$sql = "ROLLBACK";
$dbs = $dbo->prepare($sql);
$dbs->execute();
$results["error"] = "COULD NOT REMOVE GROUP! $e";
$results["success"] = false;
}
}
【问题讨论】:
-
为什么不使用 PDO 的 beginTransaction()、commit() 和 rollback() 方法?
-
大声笑我今天早上才知道 beginTransaction 方法......我想其他两个在那里,但还没有查到它们。那在 TODO 清单上,谢谢!
-
另外,您不必准备()每个语句,实际上对于您不打算插入任何变量的语句来说这是相当浪费的。只需使用 query() 运行那些。节省两行代码和不必要的准备。