php - 将事务用于具有相关结果的查询

标签 php mysql pdo transactions

这是我的脚本结构:

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;
}

我的代码的结果总是第二个问题。为什么?我该如何重写我的代码来修复它?

请注意,我已经单独测试了此条件if($num_rows) {(单独在另一个脚本中)并且它是true,但是当我将其写入上面的脚本时,它总是错误

最佳答案

事务的目的是确保必须一起发生的查询永远不会被破坏。在您的用例中,第一个查询可以单独执行,没有任何缺点。

将最后两个放入事务中,但保留第一个。如果第一个失败,就不要运行另外两个。

如果第一个成功,但另外两个(在事务中)之一失败,以致两者都没有提交,那么执行第一个不会让您的情况变得更糟。

关于php - 将事务用于具有相关结果的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38364712/

相关文章:

php - Cakephp 2 : need help on misconfiguration with PDOStatement

python - _mysql_exceptions.ProgrammingError : (1064, "You have an error in your SQ L syntax; right syntax to use near ' )' at line 1")

php - 如果语句对象未设置,是否需要调用 PDOStatement::closeCursor() ?

javascript - jQuery 循环遍历 PHP 数组的对象

php - 如何根据一个参数更改从 mysql 填充的表上的行背景

php - 帮助编辑 JSON 以生成数组而不是 'dictionary'

php - 我升级到 FQL 到 Graph API - 我是否正确使用它?

javascript - Php-Codeigniter : How to exit from ajax Manually . ?

php - 带有 bindParam 的 PDO 语句中的奇怪行为

php - 使用 PDO 将整数从 64 位转换为 32 位