使用PHP在Mysql中一次执行多个查询

时间:2015-06-07 02:16:47

标签: php mysql database

我想将大型注册表单的信息插入到Mysql数据库中。 我使用多个表并使用多个mysql_query命令。

问题是: 如果其中一个查询发生错误,则该过程会停止,但先前的查询会更改表格!

我想改变所有表格或改变任何表格! 我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您要找的是TRANSACTIONS假设您 使用MyISAM,因为它不支持Transactions

transactions的概念是要么所有查询都会执行,要么根本不执行任何查询。

简单来说,all-or-nothing就是Transactions做的事情

这是使用mysqli

的基本示例
mysqli_query("START TRANSACTION");

$query1 = mysqli_query("INSERT INTO TABLE1(id) VALUES(2)");
$query2 = mysqli_query("INSERT INTO TABLE2(id) VALUES(3)");

if ($query1 and $query2) {
   mysqli_query("COMMIT"); //Commits the current transaction
} else {        
   mysqli_query("ROLLBACK");//Even if any one of the query fails, the changes will be undone
}

注意:这只是一个简单的示例。如果您使用trycatch块实现正确处理异常,那就更好了。

查看PHP DOCS

答案 1 :(得分:0)

首先要做的事情 - 停止使用mysql_*函数,因为它们在最新版本的PHP中已被弃用,并将在下一个主要版本中删除(v7)

我建议您了解PDO,特别是您手头的问题,PDO::beginTransactionPDO::commitPDO::rollback

答案 2 :(得分:0)

正如Casimir et Hippolyte所说:使用交易。正如斯蒂芬所说:不要使用已弃用的API。这里使用的是mysqli API(作为PDO的替代品):

$link = @mysqli_connect($host, $username, $password, $db_name);
@mysqli_begin_transaction($link);
$stmt = @mysqli_prepare($link, "UPDATE table1 SET col1=?, col2=?");
@mysqli_stmt_bind_param($stmt, 'ss', $someString, $someOtherString);
if (@mysqli_stmt_execute($stmt)) {
    $stmt2 = @mysqli_prepare($link, "UPDATE table2 SET col3=?, col4=?");
    @mysqli_stmt_bind_param($stmt2, 'id', $someInteger, $someDouble);
    if (@mysqli_stmt_execute($stmt2)) {
        @mysqli_commit($link);
    } else {
        @mysqli_rollback($link);
    }
} else {
    @mysqli_rollback($link);
}