如何解决如何在mysql和php中一次运行多个查询
我有两张表,一张是“评论”,另一张是“待定评论”。我希望当我复制 'comment' 表中的 'pendingcomment' 数据时,应该从 'pendingcomment' 表中删除该数据。
这是我的代码。
<?PHP
include '../conn.PHP';
$id = $_GET['id'];
// sql to Insert and delete a record
$sql = "INSERT INTO comment (blogid,name,email,subject,message,date) SELECT blogid,date FROM pendingcomment WHERE id= $id";
$sql .= "DELETE FROM pendingcomment WHERE id=$id";
if (MysqLi_multi_query($conn,$sql)) {
// MysqLi_close($conn);
header('Location: ../pendingcomments.PHP'); //redirect to the pending page
exit;
}
else {
echo "Error deleting record ";
}
?>
结果:删除记录时出错
解决方法
永远不要使用mysqli_multi_query()
!!!
这个函数非常不安全,导致的问题比它解决的问题多得多。事实上,它并不能解决任何问题,它只会制造更多问题。 您不能同时从 PHP 运行查询! 如果没有线程化或并行化,这是不可能做到的。如果您需要这样的东西,那么您可以查看 Swoole 或 ReactPHP,但在您的情况下可能不需要。
在执行查询时,您需要使用准备好的语句一个接一个地执行它们。这是应该如何正确完成的:
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('localhost','user','password','test');
$conn->set_charset('utf8mb4'); // always set the charset
$id = $_GET['id'];
// begin atomic transaction
$stmt = $conn->begin_transaction();
// prepare statement for insert
$stmt = $conn->prepare('INSERT INTO comment (blogid,name,email,subject,message,date) SELECT blogid,date FROM pendingcomment WHERE id= ?');
$stmt->bind_param('s',$id);
$stmt->execute();
// prepare statement for delete
$stmt = $conn->prepare('DELETE FROM pendingcomment WHERE id=?');
$stmt->bind_param('s',$id);
$stmt->execute();
// commit transaction
$conn->commit();
header('Location: ../pendingcomments.php'); //redirect to the pending page
exit;
只要您的数据库引擎是 InnoDB 或类似的事务引擎,事务就可以确保操作的原子性。 MyISAM 不是。 记得开启mysqli错误报告,不然就不行了。
,您正在执行两个查询,这意味着您需要表示第一个查询的结尾,在第一个查询的末尾添加分号 ;
以实现此目的。在下面尝试,我已将其添加到两者中:
$sql = "INSERT INTO comment (blogid,date FROM pendingcomment WHERE id= $id;";
$sql .= "DELETE FROM pendingcomment WHERE id=$id;";
这个问题值得一读,Is it bad to omit semicolon in MySQL queries? 更深入地解释了分号的用法
我还建议将这两个查询一起运行可能会给您带来一些问题,因为如果您的插入失败,您仍然会删除待处理的评论表记录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。