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

时间:2013-07-15 15:56:53

标签: php pdo

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

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

3 个答案:

答案 0 :(得分:1)

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

然而,重要的是整体代码质量,而性能方面,你几乎没有注意到任何差异。

答案 1 :(得分:1)

最佳做法是不使用foreach循环。在循环中使用sql查询是一个非常糟糕的主意,并且一种查询(插入,选择,更新或删除)无关紧要。)

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

查看此问题的已接受答案,它完全符合您的要求:PDO Prepared inserts multiple rows single query

答案 2 :(得分:0)

听起来你想要一个全有或全无的情况,他们都插入或者都失败了。

考虑使用数据库事务。开始您的交易,将insert移至另一个循环,然后在结尾处执行commit