mysql事务在循环中捕获错误

时间:2014-07-25 20:10:48

标签: php mysql foreach transactions

我做了一个函数来记录我的数据库中的一些信息,所发布的表单的一些元素由选择列表提供(多选)。

所以我有一个数组存储在我的数据库中。

我必须使用事务才能确保一切正常,但这是我第一次使用事务,而且我不知道如何继续循环。

以下是我的功能:

function recordSports() {
    if (isset($_POST['edit_sport'])) {
        //echappement des variables
        $liste_sport = mysql_real_escape_string($_POST['liste_sport']);
        $id_user     = $_SESSION['login'];
        //démarrage des transactions
        mysql_query("START TRANSACTION");

        //requettage 
        $query1 = "DELETE FROM `fit__sport_practice`
                                    WHERE 
                                    `sport_practice__id_user` = {$id_user}
                                    ";
        mysql_query($query1);

        foreach ($liste_sport as $sport) {
            $query = "INSERT INTO `fit__sport_practice`
                                                SET                                
                                                `sport_practice__id_user` = {$id_user},
                                                `sport_practice__id_sport` = {$sport},
                                            ";
            mysql_query($query);
        }
        if ($query1) {
            mysql_query("COMMIT");
            $retour['message'] = $_SESSION['maj_sport_ok'];
            $retour['error']   = 0;
        } else {
            //sinon on renvoit une erreur
            mysql_query("ROLLBACK");
            $retour['message'] = $_SESSION['maj_sport_error'];
            $retour['error']   = 1;
        }
    } else {
        $retour['message'] = null;
        $retour['error']   = null;
    }
    return $retour;
}

1 个答案:

答案 0 :(得分:1)

首先,你不应该使用mysql_ *函数,在这里阅读更多:Why shouldn't I use mysql_* functions in PHP?。据我所知,他们不支持交易,因此我认为您必须切换到PDOmysqli

很高兴知道MySQL中的标准数据库存储引擎(如果这就是你正在使用的)MyISAM也不支持事务。我使用InnoDB作为存储引擎和PDO。

注意:如果你有一个包含大量行和/或很多约束的大表,那么与MyISAM相比,InnoDB的性能会有所提高。

交易的基本流程如下(至少使用PDO):

  1. Initiate the database connection
  2. Initiate/begin the transaction
  3. 运行所有查询,最好使用prepared statementsexecute(为您提供一些防范SQL注入的防范)。在任何时候,如果出现任何问题,请制作roll back
  4. 如果一切按计划进行,commit the transaction
  5. 希望这可以帮助您开始交易!


    对不起,忘了回答你的实际问题......

    foreach循环。您希望回滚检查在循环内部,因此它可以验证每个查询并在需要时回滚。在上面的代码中有类似的东西:

        foreach ($liste_sport as $sport) {
            $query = "INSERT INTO `fit__sport_practice`
                                                SET                                
                                                `sport_practice__id_user` = {$id_user},
                                                `sport_practice__id_sport` = {$sport},
                                            ";
            if(!mysql_query($query)) {
                //sinon on renvoit une erreur
                mysql_query("ROLLBACK");
                $retour['message'] = $_SESSION['maj_sport_error'];
                $retour['error']   = 1;
                break;
            }
        }
        if (!isset($retour['error'])) {
            mysql_query("COMMIT");
            $retour['message'] = $_SESSION['maj_sport_ok'];
            $retour['error']   = 0;
        }