我想将大型注册表单的信息插入到Mysql数据库中。 我使用多个表并使用多个mysql_query命令。
问题是: 如果其中一个查询发生错误,则该过程会停止,但先前的查询会更改表格!
我想改变所有表格或改变任何表格! 我怎么能这样做?
答案 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
}
注意:这只是一个简单的示例。如果您使用try
和catch
块实现正确处理异常,那就更好了。
查看PHP DOCS
答案 1 :(得分:0)
首先要做的事情 - 停止使用mysql_*
函数,因为它们在最新版本的PHP中已被弃用,并将在下一个主要版本中删除(v7)
我建议您了解PDO,特别是您手头的问题,PDO::beginTransaction,PDO::commit和PDO::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);
}