[英]Insert large amount of array data into DB
我有一個包含數萬個數據的多維數組。 很多......數組的結構如下:
Array (
[0] => Array ( [0] => city [1] => code [2] => country )
[1] => Array ( [0] => city [1] => code [2] => country )
)
我想要做的是將數組值city,code和country插入到mysql數據庫的表中。 我發現的帖子與我想要的完全匹配,但由於某種原因,它不能與我合作。 當我說它不工作時,我的意思是PHP甚至沒有啟動。 如果我刪除下面的代碼,該文件運行正常。 所以問題確實來自代碼部分。 希望有人不介意幫助我。 先感謝您。 干杯。 渣。
//some code to build the array
//db_connect code
$sql = array();
foreach( $myarray as $row )
{
$sql[] = '("'.$row[0].'", "'.$row[1]).'","'.$row[2].'")';
}
mysql_query('INSERT INTO test (t_city, t_code, t_country) VALUES '.implode(',', $sql));
如前所述,構建sql
數組時的錯誤是一個多余的括號。 更改
$sql[] = '("'.$row[0].'", "'.$row[1]).'","'.$row[2].'")';
至
$sql[] = '("'.$row[0].'", "'.$row[1].'","'.$row[2].'")';
正如ashein在評論中指出的那樣,查詢長度受“max_allowed_paket”變量的限制。 如果查詢大於此值,則會引發錯誤並關閉連接。
$ row [1]后面有一個方括號:)
使用此(刪除括號):
$sql[] = '("'.$row[0].'", "'.$row[1].'","'.$row[2].'")';
您可以嘗試將每個數組記錄作為單獨的sql-query插入。
foreach( $myarray as $row )
{
mysql_query('INSERT INTO test (t_city, t_code, t_country) VALUES ("'.$row[0].'", "'.$row[1]).'","'.$row[2].'");
}
但會有很多疑問
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
您希望通過一次提交多個值對而不是運行到限制中來動態構建此類查詢。
所以你要做的是構建插入查詢,同時迭代地迭代一行。 如果添加行將觸發限制,則發送查詢並重置查詢:
# sample data
$data = array(
array('city1', 'code', 'country'),
array('city2', 'code', 'country'),
array('city3', 'code', 'country'),
array('city4', 'code', 'country'),
array('city5', 'code', 'country'),
array('city6', 'code', 'country'),
array('city7', 'code', 'country'),
);
$max_allowed_packet = 1048576; # mysql default value
$max_allowed_packet = 128; # for demonstration purposes
$sql = new SQLInsertQuery('INSERT INTO test (t_city, t_code, t_country) VALUES ', $max_allowed_packet);
foreach($data as $row) {
$sql->addRow($row);
}
$sql->query(); # manually query any potential left-over query.
此示例輸出以下內容:
Running: INSERT INTO test (t_city, t_code, t_country) VALUES ('city1','code','country'),('city2','code','country');
Running: INSERT INTO test (t_city, t_code, t_country) VALUES ('city3','code','country'),('city4','code','country');
Running: INSERT INTO test (t_city, t_code, t_country) VALUES ('city5','code','country'),('city6','code','country');
Running: INSERT INTO test (t_city, t_code, t_country) VALUES ('city7','code','country');
您可能還想為運行的查詢添加一個計數器,這樣您就可以在循環和最終查詢之后驗證是否發送了一個查詢(限制可能太低,因此根本不會發送任何查詢 - 具體取決於您的數據 - 所以值得對這個邊緣情況進行健全性檢查。
我希望這個例子很有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.