0

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

$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 最佳实践感兴趣。

4

3 回答 3

1

这个问题实际上与 PDO 无关,只是与常识有关。运行无用的额外循环显然比根本不运行它更糟糕。

然而,它对整体代码质量更重要,而在性能方面你几乎不会注意到任何差异。

于 2013-07-15T16:00:40.800 回答
1

最佳做法是不使用任何 foreach 循环。在循环中使用 sql 查询是一个非常糟糕的主意,查询类型(插入、选择、更新或删除)并不重要)。

您应该做的是使用循环进行一次查询并仅执行一次。不幸的是,PDO 没有提供任何自动方式来执行此操作,因此您必须手动编写它。

看看这个问题的接受答案,它正是你所需要的:PDO Prepared inserts multiple rows single query

于 2013-07-15T16:04:04.040 回答
0

听起来你想要一个全有或全无的情况,要么全部插入,要么全部失败。

考虑为此使用数据库事务。开始你的交易,向上移动insert到另一个循环,然后commit在最后做一个。

于 2013-07-15T16:05:05.603 回答