【问题标题】:PHP try/catch with SQL. All or NothingPHP try/catch 与 SQL。全有或全无
【发布时间】:2014-11-05 14:16:55
【问题描述】:

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

此代码块尝试更新两个独立数据库中用户的密码。第一个查询进行,然后切换数据库,然后进行第二个查询。如果出现错误,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");
                }

【问题讨论】:

    标签: php mysql try-catch


    【解决方案1】:

    你可以尝试添加

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

    看看有没有错误

    【讨论】:

      【解决方案2】:

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

      Use SQL transactions.

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 2020-04-02
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多