这是我的脚本结构:
try {
$dbh_conn->beginTransaction();
$stmt1 = $dbh_conn->prepare("SELECT user_id FROM activate_account WHERE token = ?");
$stmt1->execute(array($validate_activate_token));
$num_rows = $stmt1->fetch(PDO::FETCH_ASSOC);
if($num_rows) {
$user_id = $num_rows['user_id'];
$stmt2 = $dbh_conn->prepare("UPDATE users SET active = 1 WHERE id = ?");
$stmt2->execute(array($user_id));
$updated = $stmt2->rowCount();
if ( $updated > 0 ){
$stmt3 = $dbh_conn->prepare("DELETE FROM activate_account WHERE token = ?");
$stmt3->execute(array($validate_activate_token));
$status = "all fine";
} else {
$status = "first problem";
}
} else {
$status = "second problem";
}
$dbh_conn->commit();
echo $status;
die;
} catch(PDOException $e) {
$dbh_conn->rollBack();
$status = "third problem";
echo $status;
die;
}
我的代码总是的结果是second problem
。为什么?我怎样才能重写我的代码来修复它?
请注意,我已经单独测试了这个条件if($num_rows) {
(单独在另一个脚本中),它是 true ,但是当我把它写入上面的脚本时,它始终是 false 。
答案 0 :(得分:0)
交易的目的是确保必须一起发生的查询永远不会被打破。在您的用例中,第一个查询可以独立执行,没有任何缺点。
将最后两个放在一个交易中,但保留第一个。如果第一个失败,就不要运行其他两个。
如果第一个成功,但另外两个中的一个(在事务中)失败,以致两者都没有被提交,那么执行第一个就不会更糟。