我有一个偶尔重建的缓存表:
$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);
}
我应该考虑什么来决定在第一个foreach
中运行$stmt->execute()
以及消除第二个foreach
和$items_to_insert
阵列是否更好?有没有办法让execute()
与下一个foreach
循环同时运行?这是针对一个可能在各种硬件上运行的应用程序,因此我对在我的工作站上进行基准测试的具体情况不感兴趣,但我感兴趣的是了解复杂的情况,以更好地利用PDO最佳实践
最佳实践是不使用foreach循环。在循环中使用sql查询是一个非常糟糕的主意,而且查询类型(插入、选择、更新或删除)无关紧要。
您应该做的是使用循环使成为一个查询,并且只执行一次。不幸的是,PDO没有提供任何自动的方法来实现这一点,所以您必须手动编写它。
看看这个问题的公认答案,它正是你所需要的:PDO Prepared插入多行单个查询
这个问题实际上与PDO无关,只是与常识有关。运行无用的额外循环显然比根本不运行它更糟糕。
然而,它对整体代码质量非常重要,而在性能方面,您几乎不会注意到任何差异。
听起来你想要一种要么全有要么全无的情况,要么全部插入,要么全部失败。
请考虑为此使用数据库事务。开始事务,将insert
向上移动到另一个循环,然后在最后执行commit
。