在主foreach()或单独的foreach(()中插入


INSERT in main foreach() or in separate foreach()?

我有一个偶尔重建的缓存表:

$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