2012-03-15 13 views
0

私は10万のデータを含む多次元配列を持っています。多くが...配列は、このように構成されています。私がやろうとしています大量の配列データをDBに挿入する

Array ( 

    [0] => Array ([0] => city [1] => code [2] => country) 

    [1] => Array ([0] => city [1] => code [2] => country)  

) 

何mysqlデータベース内のテーブルに配列が都市、コードと国を値挿入することです。私は正確に私がやりたいことに合った投稿を見つけましたが、何らかの理由で私と一緒に働いていません。私はそれが動作していないと言うとき、私はPHPが起動しないことを意味します。以下のコードを削除すると、ファイルは正常に実行されます。ですから問題は実際にはそのコード部分から来ています。誰かが私を助けてくれることを願っています。前もって感謝します。乾杯。マーク

$sql[] = '("'.$row[0].'", "'.$row[1].'","'.$row[2].'")'; 
+1

コードはきれいに見えます。 SQLクエリーの中に何千ものデータを埋め込むことはできません。 – seferov

+0

コードが挿入されたときにPHPファイルが実行されないため、別のエラーが発生することがあります... – Marc

+3

[PHPのクエリは "max_allowed_pa​​cket"によって制限されています...](http://stackoverflow.com/questions/ 5735150/php-max-insert-in-one-sql-query) – ashein

答えて

2

としては、前にも言ったクエリの多くがあるだろう、sql配列を構築する上での誤差は、余剰ブラケットです。 asheinはコメントで述べたように変更します

$sql[] = '("'.$row[0].'", "'.$row[1]).'","'.$row[2].'")'; 

$sql[] = '("'.$row[0].'", "'.$row[1].'","'.$row[2].'")'; 

に、クエリの長​​さは "max_allowed_paket"変数によって制限されています。クエリがこれより大きい場合、エラーが発生し、接続が閉じられます。

0

foreach($myarray as $row) 
{ 
    mysql_query('INSERT INTO test (t_city, t_code, t_country) VALUES ("'.$row[0].'", "'.$row[1]).'","'.$row[2].'"); 
} 

しかし

0

はあなたが別のSQLクエリなど、すべてのアレイレコードを挿入しようとすることができます。この$行[1] :)

使用後ブラケット(ブラケットを除く)があり

//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)); 
+0

絶対に。私はこれを避けようとしています。どのように考えていますか? – Marc

0
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 

このようなクエリを動的に作成するには、一度に複数の値のペアを送信し、制限に達しないようにします。

それでは、挿入クエリを作成しながら、繰り返して1つの行を追加します。行を追加すると、上限をトリガーする場合は、クエリが送信され、クエリがリセットされます:

# 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'); 

DemoGist

あなたがしたいかもしれませんクエリを実行するためのカウンタを追加すると、ループの後で検証できます。すべてのクエリが送信された場合は最終的なクエリが有効になります(制限は低すぎるため、データは送信されません。健全性をチェックする価値があるrこのエッジケース)。

この例が役立ちますようにお願いします。

関連する問題