以下を前提に回答させていただきます。
- DB接続ライブラリはPDO
- "id", "name"という名前のカラムを持つテーブル"sample"に、バルクインサートする
- 配列"$arr"の要素数は不定。ただし、少なくとも1つの要素を持つ。
- 配列"$arr"の各要素は全て、("id" => Int型, "name" => String型) という2つの要素を持つ。
php
1// $arr = [];
2$arr[] = array('id' => 1, 'name' => 'suzuki');
3$arr[] = array('id' => 2, 'name' => 'takahashi');
4$arr[] = array('id' => 3, 'name' => 'tanaka');
5
6$clauses = array_fill(0, count($arr), '(?, ?)');
7
8$sql = 'INSERT INTO sample (id, name) VALUES ' . implode(', ', $clauses);
9
10$pdo = new PDO(...); // 割愛
11
12$statement = $pdo->prepare($sql);
13
14$index = 1;
15foreach ($arr as $row) {
16 $statement->bindValue($index, $row['id'], PDO::PARAM_INT);
17 $index++;
18
19 $statement->bindValue($index, $row['name'], PDO::PARAM_STR);
20 $index++;
21}
22
23$statement->execute();
ただし、私はお勧めしません。
動的にバルクインサート文を作成するプログラムは若干、複雑ですし、
MySQLには受信できるパケット(SQL文など)の大きさに制限があるため、
インサートするデータの量やお使いのMySQLサーバの設定によっては、うまく動作しないためです。
以下のように、1レコードをインサートするSQL文のプリペアドステートメント($statement変数)に対して、
バインドする値だけを切り替えながら繰り返しインサートを実行する方法をお勧めします。
必要なら、トランザクションをかけてやるとなお良いでしょう。
php
1// $arr = [];
2$arr[] = array('id' => 1, 'name' => 'suzuki');
3$arr[] = array('id' => 2, 'name' => 'takahashi');
4$arr[] = array('id' => 3, 'name' => 'tanaka');
5
6$sql = 'INSERT INTO sample (id, name) VALUES (?, ?)';
7
8$pdo = new PDO(...); // 割愛
9
10$statement = $pdo->prepare($sql);
11
12foreach ($arr as $row) {
13 $statement->bindValue(1, $row['id'], PDO::PARAM_INT);
14 $statement->bindValue(2, $row['name'], PDO::PARAM_STR);
15
16 $statement->execute();
17}