我正在尝试删除某些代码中 for 循环中正在运行的 MySQL 查询。
但我不确定如何最好地实现这一目标。
使用带有命名参数的 PHP PDO,如何存储查询,然后在循环后批量运行它们?所以 for 循环中发生的唯一事情是构建查询,但直到循环完成后才执行?
这里是示例代码:
for($i=$rowcount; $i>0; $i--){
$id = $array[$i];
$query = "DELETE FROM table WHERE ID=:id AND Order=:order";
$stmt = $conn->prepare($query);
$stmt->execute(array('id' => $id, 'order' => $i));
}
最佳答案
我的第一 react 是:为什么要这样做?你的动机是什么?只是避免循环中的 SQL,或者您是否有某种想要避免的操作问题?
您的精确查询不会那么容易转换为单个查询,因为您确实有 ID
的元组和 Order
必须匹配才能删除的值。另请注意,准备好的语句通常不接受任意数量的参数,因此即使您能够将查询转换为 DELETE FROM table WHERE (ID=1 AND Order=1000) OR (ID=4 AND Order=1234)...
形式,您必须以某种方式弄清楚如何填充第一个,第二个,第三个......占位符。此外,您将被迫动态生成准备好的语句,这可能与安全性方面应如何完成准备好的语句相反。
如果您遇到性能问题,因为逐个删除 1000 个条目会产生很大影响,那么还有其他选择:如果您将删除操作包含在一个事务中,那么删除多少条目可能并不重要 -一旦事务提交,所有这些都将被删除。另请注意,使用准备好的语句是加速数据库操作的一种方法 - 但前提是您仅在循环之前准备一次,并且在循环内您只需一次又一次地传递新参数。
总结一下:如果您想要解决的编程问题可以使用循环更好地解决,并且没有其他与之相关的问题,那么在循环中撤消 SQL 并不是最好的事情。然而,如果存在这样的问题,则必须对其进行分析和提及 - 消除循环并不是自动成功的故事。
关于php - 在 For 循环中运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988703/