【问题标题】:Multiple mysqli prepared statements with transactions多个带有事务的 mysqli 准备语句
【发布时间】:2014-11-07 17:58:34
【问题描述】:

我试图弄清楚如何将 sql 事务与 mysqli 准备好的语句一起使用。我找不到任何使用多个准备好的语句(不是 OO)的示例,所以我不确定如何使用它们的事务。 这是我能想到的最接近的:

    mysqli_autocommit($database, FALSE);

    $transferq = 'INSERT INTO money (user_id, bank, onhand, type, amount, source) VALUES (?, ?, ?, ?, ?, ?)';
    $transferstmt = mysqli_stmt_init($database);
    mysqli_stmt_prepare($transferstmt, $transferq);
    mysqli_stmt_bind_param($transferstmt, 'iiisis', $userid, $newbank, $newmoney, $type, $amount, $source);
    mysqli_stmt_execute($transferstmt);

    $insertq = 'UPDATE users SET money=?, bank=? WHERE user_id=' . $userid . ' LIMIT 1';
    $insertstmt = mysqli_stmt_init($database);
    mysqli_stmt_prepare($insertstmt, $insertq);
    mysqli_stmt_bind_param($insertstmt, 'ii', $newmoney, $newbank);
    mysqli_stmt_execute($insertstmt);

    mysqli_commit($database);

但是,我不知道这是否可行。不过,我最大的问题是我不确定如何检查查询是否失败(以及是否提交)。我看到一个例子,我认为它做了类似的事情

if(mysqli_stmt_execute($stmt)){
    mysqli_commit($database);
}else{
    mysqli_rollback($database);
}

但我真的不能这样做,因为我有多个准备好的语句要执行。

这应该如何工作?

【问题讨论】:

    标签: php sql mysqli prepared-statement sqltransaction


    【解决方案1】:

    也许我没听懂你的问题,但是这个呢?

    mysqli_autocommit($database, FALSE);
    
    $transferq = 'INSERT INTO money (user_id, bank, onhand, type, amount, source) VALUES (?, ?, ?, ?, ?, ?)';
    $transferstmt = mysqli_stmt_init($database);
    mysqli_stmt_prepare($transferstmt, $transferq);
    mysqli_stmt_bind_param($transferstmt, 'iiisis', $userid, $newbank, $newmoney, $type, $amount, $source);
    if (not mysqli_stmt_execute($transferstmt) ){
        mysqli_rollback($database);
        return;
    }
    
    $insertq = 'UPDATE users SET money=?, bank=? WHERE user_id=' . $userid . ' LIMIT 1';
    $insertstmt = mysqli_stmt_init($database);
    mysqli_stmt_prepare($insertstmt, $insertq);
    mysqli_stmt_bind_param($insertstmt, 'ii', $newmoney, $newbank);
    
    if (not mysqli_stmt_execute($insertstmt) ){
        mysqli_rollback($database);
        return;
    }
    
    mysqli_commit($database);
    

    如果这种面向对象的形式使用 mysqli 或 PDO(没有事务,作为使用数据库的方式的示例)的下一个级别:

    class my_database{
        private static $inner_link_to_driver;
        protected static function factory( ){
            if (not static::$inner_link_to_driver){
                static::$inner_link_to_driver = new ...(USER, SERVER, PASSWD, PORT);
            }
            return static::$inner_link_to_driver;
        }
        public static function do_something($params, &$message ){
            $query = "...";
            $stmt = static::factory()->prepare($query);
            if (not $stmp ){
                $message = 'Error prepare query '.$query.PHP_EOL.static::factory()-> ..(get_error);
                return FALSE;
            }
    
            if (not $stmt->execute($params) ){
                $message = 'Error execute query '.$query.PHP_EOL.static::factory()-> ..(get_error);
                return FALSE;
            }
            return TRUE;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 2015-06-01
      • 1970-01-01
      • 2017-03-08
      • 2017-02-25
      • 2012-12-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多