2010-10-26 92 views
0

我有一個數組有30000個條目,需要進入一個MySQL表。php + mysql:插入一個php數組到mysql

最佳做法是什麼?從這裏?假設數據庫中的[0],[1]和[2]是'title','type'和'customer'

它是否添加與表中列名稱匹配的鍵名稱並調用som「magic 「功能?或建立手動查詢...

Array 
(
    [0] => Array 
     (
      [0] => 2140395946 
      [1] => 1SAP 
      [2] => 0041451463 
     ) 

    [1] => Array 
     (
      [0] => 2140411607 
      [1] => 2SAP 
      [2] => 0041411940 
     ) 

    [2] => Array 
     (
      [0] => 2140706194 
      [1] => 4SAP 
      [2] => 0041411943 
     ) 
etc. etc. 

更新 - 基於答案

感謝您的答案。

的解決方案通常是手動創建的SQL字符串和所有行可插入的一個:

INSERT INTO `tx_opengate_table` (`machine` ,`customer` ,`type`) 
VALUES 
    ('m123', 'dfkj45', 'A'), 
    ('m137', 'kfkj49', 'A'), "repeat this line for each entry in the array" 
    ... ... ... 
    ('m654321', '34dgf456', 'C4') "end with out comma, or remove last comma" 
; 

特供TYPO3

我碰巧做到這一點的CMS TYPO3而只是遇到了一個新的功能添加不是很久以前:

//Insert new rows 
$table = 'tx_opengate_stuff'; 
$fields = array('machine','type','customer'); 
$lines = "array as given above" 
$GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows($table,$fields,$lines); 

回答

3

我會說只是自己建造它。你可以這樣設置:

$query = "INSERT INTO x (a,b,c) VALUES "; 
foreach ($arr as $item) { 
    $query .= "('".$item[0]."','".$item[1]."','".$item[2]."'),"; 
} 
$query = rtrim($query,",");//remove the extra comma 
//execute query 

如果有必要的話,不要忘記逃避引號。

另外,請注意不要一次發送太多的數據。您可能需要一次執行而不是全部執行。

+0

超級。這就對了。我想它應該是$ item [0],$ item [1]和$ item [2],而不是$ arr數組,它應該包含$ query字符串。 – Tillebeck 2010-10-28 07:02:21

+0

對,對不起。我修好了它。 – 2010-10-28 15:54:55

+0

正如您在最近的評論中所述,它總是必要的:) – 2011-01-27 18:18:26

2

神奇的功能?我猜你是指某種數據庫抽象層?恕我直言,這隻會加倍你的工作。

只需手動構建查詢,循環訪問array [] INSERT'ing值。

1

如果您希望在此操作過程中獲得最佳性能,您將不得不手動構建查詢。如果您要使用PDO或某個abstarction層迭代添加所有內容,則會有30000個插入查詢。

使用foreach來遍歷arraay,構建一個嵌套的INSERT查詢,該查詢一次完成所有工作,並將其發送到服務器。

+0

在這裏做擴展插入是一個壞主意。曾經見過當你填充MySQL緩衝區時會發生什麼?也許一次做10個擴展插入不是一個壞主意,但這取決於數據長度。 – Brad 2010-10-26 21:21:23

+0

在MySQL中進行批量插入時,您應該始終注意緩衝區大小。這並不是一個壞主意。我從來沒有遇到過這樣的問題,一次沒有設置它就會有100 - 1000條記錄。您可以通過設置bulk_insert_buffer_size值來配置緩衝區的長度。它默認爲8388608,所以你是否會遇到問題真的取決於字段值的大小。顯然,當我試圖一次插入1000行時,一行的值的平均長度小於830個字符。通過查看這個問題,我不希望一行超過40個字符。 – 2010-10-27 08:23:58

2
$statement = "INSERT INTO table (title, type, customer) VALUES "; 
foreach($data as $row) { 
    $statement .= ' ("' . implode($row, '","') . '")'; 
} 

更新:更改爆炸implode(我總是得到那些困惑)。

+0

太好了。像這樣的東西。我想你會使用「implode」將$ row數組連接到一個字符串,對吧?否則我misunderstod ;-) – Tillebeck 2010-10-28 06:58:06

+0

我發現這一個最好的答案如果你改變爆炸內爆...... – 2012-03-25 23:25:16