2009-04-09 67 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的使用上面嘗試使用循環以下。相反,你可以將數據合併到一個單一的數據庫查詢。

​​
相關問題