如何使用PHP准备好的statemens与MySQL的事务执行乘法查询?

时间:2016-04-13 14:04:42

标签: php mysql mysqli transactions prepared-statement

我需要使用PHP的预处理语句和MySQL的事务执行2个或更多不完全相同的查询(在此示例中为INSERT。)。因此,如果我有2个INSERT语句,我希望它们都被执行,或者都不执行。

我想将这个示例MySQL事务转换为PHP代码:

START TRANSACTION;
     INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES ('file.png', 'image/png', '1024', 'My comment');
     INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (LAST_INSERT_ID(), '1');
COMMIT;  

PHP代码I'我正在努力:

mysqli_autocommit($connection, FALSE);
if ($stmtFile = mysqli_prepare($connection, "INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES (?, ?, ?, ?)")) {
    mysqli_stmt_bind_param($stmtFile, 'ssis', $name, $mime_type, $size, $comment);
    if (mysqli_stmt_execute($stmtFile)) {
        if ($stmtComplementaryFile = mysqli_prepare($connection, "INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (?, ?)")) {
            mysqli_stmt_bind_param($stmtComplementaryFile, 'ii', mysqli_insert_id($connection), $user_id);
            mysqli_stmt_execute($stmtComplementaryFile);
        }
    } else {
        mysqli_rollback($connection);
    }
}
mysqli_commit($connection);  

上面的PHP代码可以工作,但是如果我有更多的关键语句要执行呢?是否有很好的方法可以同时使用PHP准备好的statemens 事务来执行语句?

请注意,对于$stmtComplementaryFile,我的值必须为mysqli_insert_id()。另请注意,我没有在此代码中使用PDO - 如果建议是MySQLi,我将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

以下SQL:

mysqli_begin_transaction($connection, MYSQLI_TRANS_START_READ_WRITE);
if ($stmtFile = mysqli_prepare($connection, "INSERT INTO `file` (`name`, `mime_type`, `size`, `comment`) VALUES (?, ?, ?, ?)")) {
    mysqli_stmt_bind_param($stmtFile, 'ssis', $name, $mime_type, $size, $comment);
    if (mysqli_stmt_execute($stmtFile)) {
        if ($stmtComplementaryFile = mysqli_prepare($connection, "INSERT INTO `complementary_file` (`file_id`, `user_id`) VALUES (?, ?)")) {
            mysqli_stmt_bind_param($stmtComplementaryFile, 'ii', mysqli_insert_id($connection), $user_id);
            mysqli_stmt_execute($stmtComplementaryFile);
        }
    } else {
        mysqli_rollback($connection);
    }
}
mysqli_commit($connection);  

可以转换为PHP(带有预准备语句),如下所示:

atomicity

一般来说,这两个陈述是等价的,但最好知道哪些交易是什么,哪些交易不是。

事务是一种确保批量操作以原子方式执行的机制,只有当所有这些操作都成功时,它们的结果才会反映在数据库中。它确保了LOCK TABLES [READ|WRITE]次操作。

事务不是在表上实现互斥锁的机制。如果需要锁定表,则需要使用mysqli_query($connection, "LOCK TABLES tableName as TableAlias [read|write]"); 。在PHP中等效地通过执行以下操作来实现:

mysqli_query($connection, "UNLOCK TABLES"); 

接着是

{{1}}