微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在mysql和php中一次运行多个查询

如何解决如何在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 运行查询! 如果没有线程化或并行化,这是不可能做到的。如果您需要这样的东西,那么您可以查看 SwooleReactPHP,但在您的情况下可能不需要。

在执行查询时,您需要使用准备好的语句一个接一个地执行它们。这是应该如何正确完成的:

<?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 举报,一经查实,本站将立刻删除。