php - PHP 多重查询
问题描述
不能在不同的表上同时执行插入和删除吗?还是我错过了什么
if(isset($_POST['update']))
{
$id = $_POST['delete_id'];
$name= $_POST['edit_name'];
$name2= $_POST['edit_name2'];
$pic = $_POST['edit_pic'];
$contactnumber = $_POST['edit_contact'];
$address = $_POST['edit_address'];
$details = $_POST['edit_details'];
$query = "INSERT INTO tabletest (name,name2,pic,contact,address,details,) VALUES ('$name' , '$name2' , '$pic' , '$contactnumber' , '$address' , '$details')";
$query .= "DELETE FROM tabletest2 WHERE id='$id'";
if (mysqli_multi_query($connection, $query))
{
$_SESSION['success'] = "Data Updated";
header('Location: blankpage.php');
}
else
{
$_SESSION['status'] = "Error, Please try again";
header('Location: blankpage.php');
}
}
解决方案
可以同时执行 DELETE 和 INSERT,但它们需要是单独的查询。如果您想让这两个操作都成为原子操作(两者都必须成功或都不应该执行),那么您需要使用DB transactions。
要将 2 个查询作为单个原子语句执行,您可以执行以下操作:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connection = new mysqli();
$connection->set_charset('utf8mb4'); // always set the charset
if (isset($_POST['update'])) {
$id = $_POST['delete_id'];
$name = $_POST['edit_name'];
$name2 = $_POST['edit_name2'];
$pic = $_POST['edit_pic'];
$contactnumber = $_POST['edit_contact'];
$address = $_POST['edit_address'];
$details = $_POST['edit_details'];
// start transaction
$connection->begin_transaction();
try {
$stmt = $connection->prepare('INSERT INTO tabletest (name,name2,pic,contact,address,details,) VALUES (?,?,?,?,?,?)');
$stmt->bind_param('ssssss', $name, $name2, $pic, $contactnumber, $address, $details);
$stmt->execute();
$stmt = $connection->prepare('DELETE FROM tabletest2 WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();
// save data and end transaction
$connection->commit();
$_SESSION['success'] = "Data Updated";
header('Location: blankpage.php');
} catch (Exception $e) {
$connection->rollback();
$_SESSION['status'] = "Error, Please try again";
header('Location: blankpage.php');
}
}
推荐阅读
- android - mkdirs 在某些设备中返回 false
- sql-server - 空记录集值 - sql server 2017
- node.js - 无法使用 nodemailer 和 Outlook 发送电子邮件
- java - Spring Batch:从 txt 文件中读取并将所有行作为单个字符串返回给处理器
- ios - 无法接收推送通知
- angular - 如何修复 Ionic 3 应用程序中缺少的“找不到模块”构建错误
- javascript - 我怎样才能结合这些功能
- java - 如何在 dl4j 中正确使用我的神经网络?
- python - ipython中的time.sleep非常不准确
- angular - 带有 *ngFor 的材料表,显示列作为对象数组