1

我试图弄清楚如何将 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);
}

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

这应该如何工作?

4

1 回答 1

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;
    }
}
于 2014-11-07T19:04:22.003 回答