PHP使用SQL进行try/catch。要么全有,要么全无

PHP使用SQL进行try/catch。要么全有,要么全无,php,mysql,try-catch,Php,Mysql,Try Catch,我需要同时在两个数据库中进行更改,但如果其中一个数据库失败,我不希望它们中的任何一个都通过 这段代码试图更新两个独立数据库中用户的密码。第一个查询执行,然后切换数据库,然后执行第二个查询。如果出现错误,try/catch块将触发,但是,如果第一个查询成功,而第二个查询不成功,则尽管抛出并捕获了异常,第一个查询仍然会执行。try/catch不是正确的方法吗 谢谢你的意见 try { $new_hash = password_

我需要同时在两个数据库中进行更改,但如果其中一个数据库失败,我不希望它们中的任何一个都通过

这段代码试图更新两个独立数据库中用户的密码。第一个查询执行,然后切换数据库,然后执行第二个查询。如果出现错误,try/catch块将触发,但是,如果第一个查询成功,而第二个查询不成功,则尽管抛出并捕获了异常,第一个查询仍然会执行。try/catch不是正确的方法吗

谢谢你的意见

                try {

                    $new_hash = password_encrypt($new_password);

                    $query = "UPDATE user SET ";
                    $query .= "user.hashedPassword = '{$new_hash}' ";
                    $query .= "WHERE user.userID = '{$user_id}' ";

                    if(!mysqli_query($connection, $query)) {
                        throw new Exception('Change Unsuccessful.');
                    }

                    if(!mysqli_select_db($connection, 'sub_' . $user['username'] . '_db')) {
                        throw new Exception('Change Unsuccessful. Switch Error.');
                    }

                    $query = "UPDATE user SET ";
                    $query .= "user.hashedPassword = '{$new_hash}' ";
                    $query .= "WHERE user.userID = '{$user_id}' ";

                    if(!mysqli_query($connection, $query)) {
                        throw new Exception('Change Unsuccessful.');

                    }

                    $_SESSION['message'] = 'Password Changed.';
                    $_SESSION['messageType'] = 'success';

                    redirect_to("/main.php");

                } catch(Exception $e) {
                    $_SESSION['message'] = $e->getMessage();
                    $_SESSION['messageType'] = 'danger';
                    redirect_to("/main.php");
                }
您可以尝试添加

if (!$mysqli->query("query")) 
{
        printf("Error: %s\n", $mysqli->error);
}

看看是否有任何错误

我知道这是旧的,但我首先通过DuckDuckGo搜索发现了它。以下是我认为正确的答案

在您的情况下,必须为两个数据库启动事务,如果其中一个数据库引发异常,则将它们都回滚

在一天结束时,事务允许您实际尝试并完成或撤消该命令