将MySQL查询放在PHP循环中是不是很糟糕?

时间:2009-04-09 06:15:47

标签: php mysql

我经常在PHP中使用大型数组或大量动态数据来运行MySQL查询来处理。

是否有更好的方法可以运行INSERT或UPDATE等许多进程,而无需循环使用INSERT-ed或UPDATE-ed信息?

示例(为了简洁起见,我没有使用准备好的声明):

$myArray = array('apple','orange','grape');

foreach($myArray as $arrayFruit) {
$query = "INSERT INTO `Fruits` (`FruitName`) VALUES ('" . $arrayFruit . "')";
mysql_query($query, $connection);
}

6 个答案:

答案 0 :(得分:20)

选项1 您实际上可以一次运行多个查询。

$queries = '';

foreach(){
    $queries  .= "INSERT....;";  //notice the semi colon
}

mysql_query($queries, $connection);

这样可以节省您的处理费用。

选项2

如果您的插入对于同一个表来说很简单,您可以在一个查询中执行多个插入

$fruits = "('".implode("'), ('", $fruitsArray)."')";
mysql_query("INSERT INTO Fruits (Fruit) VALUES $fruits", $connection);

查询最终看起来像这样:

$query = "INSERT INTO Fruits (Fruit)
  VALUES
  ('Apple'),
  ('Pear'),
  ('Banana')";

这可能是您想要的方式。

答案 1 :(得分:5)

如果你有mysqli类,你可以使用预准备语句迭代值以插入。

$sth = $dbh->prepare("INSERT INTO Fruits (Fruit) VALUES (?)");
foreach($fruits as $fruit)
{
    $sth->reset(); // make sure we are fresh from the previous iteration
    $sth->bind_param('s', $fruit); // bind one or more variables to the query
    $sth->execute(); // execute the query
}

答案 2 :(得分:3)

关于jerebear内爆方法的原始解决方案(之前我曾经使用过,并且很喜欢),有一点需要注意的是它更容易阅读。内爆需要更多程序员的大脑周期来理解,这可能比处理器周期更昂贵。过早的优化,等等,等等,等等......:)

答案 3 :(得分:2)

关于jerebear在一个INSERT中使用多个VALUE块的答案有一点需要注意:

对于大量数据而言可能相当危险,因为大多数DBMS对其可以处理的命令的大小有上限。如果超过VALUE块太多,则插入失败。例如,在MySQL上,限制通常是1MB AFAIK。

因此,您应该弄清楚最大大小是什么(理想情况是在运行时,可以从数据库元数据中获得),并确保通过将值列表分散到多个INSERT来确保不超过它。

答案 4 :(得分:0)

我的灵感来自于jerebear的回答,为我当前的一个项目建立了类似他的第二个选项。由于记录的剪切量,我无法保存并立即执行所有数据。所以我构建this来进行导入。您添加数据,然后在每个记录完成时调用方法。在一定的,可配置的记录数量之后,内存中的数据将使用像jerebear的第二个选项一样的大量插入来保存。

// CREATE TABLE example ( Id INT, Field1 INT, Field2 INT, Field3 INT);
$import=new DataImport($dbh, 'example', 'Id, Field1, Field2, Field3');
foreach ($whatever as $row) {
  // add data in the order of your column definition
  $import->addValue($Id);
  $import->addValue($Field1);
  $import->addValue($Field2);
  $import->addValue($Field3);
  $import->nextRow();
}
$import->lastRow();

答案 5 :(得分:0)

foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name)  VALUES("'.$user['first_name'].'",        "' . $user['last_name'] . '")';
mysql_query($query);

}

Insted使用以上内容尝试以下操作。您可以将数据合并到一个数据库查询中,而不是使用循环。

$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);

Produces:

INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...