PHP try / catch with SQL。全是或全无

时间:2014-11-05 14:16:56

标签: php mysql try-catch

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

此代码块尝试在两个单独的数据库中更新用户的密码。第一个查询,然后切换数据库,然后第二个查询。如果出现错误,try/catch块将会触发,但是如果first query is successfulsecond query is notfirst query仍然通过,尽管异常被抛出并被捕获。 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");
                }

2 个答案:

答案 0 :(得分:0)

您可以尝试添加

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

并查看是否有任何错误

答案 1 :(得分:0)

我知道这很旧,但是我首先通过DuckDuckGo搜索遇到了它。我认为这是正确的答案;

Use SQL transactions

在这种情况下,您必须启动两个数据库的事务,并且如果任何一个数据库引发异常,请将它们都回滚。

最终,通过事务处理,您可以实际尝试完成或撤消该命令。