2009-04-09 74 views
10

我经常拥有大型数组,或者PHP中需要运行MySQL查询来处理的大量动态数据。在PHP循环中放置MySQL查询是否很糟糕?

是否有更好的方式来运行像INSERT或UPDATE这样的许多进程而不循环要插入或更新的信息?

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

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

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

好问题;) – markus 2009-04-09 17:57:38

+0

哈哈......抱歉,我真的很好奇,我也不想看起来像个混蛋,你猎权 – johnnietheblack 2009-04-10 20:00:58

回答

20

OPTION 1 实际上,你可以同时运行多个查询。

$queries = ''; 

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

mysql_query($queries, $connection); 

这将节省您的处理。

OPTION 2

如果你插入的是简单的同一个表,你可以做多个插入在一个查询

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

查询最终看起来是这样的:

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

这可能是你想要去的方式。

+0

...这样一个大的有效载荷(100潜在的INSERT语句捆绑)以上分离。有道理......谢谢:) – johnnietheblack 2009-04-09 06:27:24

+1

如果你能摆动它,选项#2真的是更好的选择。 – jerebear 2009-04-09 06:28:45

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 
} 
3

有一点要注意你在jerebear的内爆法原液(我以前用过,爱情)是更容易阅读。内爆需要更多程序员的大脑周期来理解,这可能比处理器周期更昂贵。不成熟的优化,等等,等等,等等...... :)

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(); 
2

有一点需要注意jerebear与多个VALUE块答案在一个INSERT:

它可以是相当危险的,真正的大数据量,因为大多数DBMS对大小上限他们可以处理的命令。如果您的VALUE块数量过多,则插入操作将失败。在MySQL上,例如限制通常是1MB AFAIK。

因此,您应该弄清楚最大大小是多少(理想情况下在运行时可能会从数据库元数据中获得),并确保通过将值列表分布在多个INSERT上,从而不超过它。

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

}

insted的使用上面尝试使用循环以下。相反,你可以将数据合并到一个单一的数据库查询。

​​