我有一个偶尔重建的缓存表:
$Sql = 'INSERT INTO someTable (...fields...) VALUES (...values...)';
$stmt = $pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$items_to_insert[] = array();
foreach ($item as $i) {
$details = array();
// Lots of things here, such as:
$details[':username'] = $['username'];
$items_to_insert[] = $details
}
foreach ($items_to_insert as $i) {
$stmt->execute($i);
}
我应该考虑什么来决定是否最好在第一个$stmt->execute()
中运行foreach
并消除第二个foreach
和$items_to_insert
数组?有没有办法让execute()
与下一个foreach
循环同时运行?这适用于可能在各种硬件上运行的应用程序,因此我对工作站上的基准测试的具体情况不感兴趣,而是我有兴趣了解情况的复杂性更好地利用PDO最佳实践。
答案 0 :(得分:1)
这个问题实际上与PDO无关,只是与常识有关。运行无用的额外循环显然比不运行它更糟糕。
然而,重要的是整体代码质量,而性能方面,你几乎没有注意到任何差异。
答案 1 :(得分:1)
最佳做法是不使用foreach循环。在循环中使用sql查询是一个非常糟糕的主意,并且一种查询(插入,选择,更新或删除)无关紧要。)
您应该做的是使用循环进行一次查询并仅执行一次。不幸的是,PDO没有提供任何自动方式来执行此操作,因此您必须手动编写它。
查看此问题的已接受答案,它完全符合您的要求:PDO Prepared inserts multiple rows single query
答案 2 :(得分:0)
听起来你想要一个全有或全无的情况,他们都插入或者都失败了。
考虑使用数据库事务。开始您的交易,将insert
移至另一个循环,然后在结尾处执行commit
。