PHP
1$data = array(
2 array(
3 'id' => 101,
4 'name' => '鈴木',
5 ),
6 array(
7 'id' => 102,
8 'name' => '田中',
9 ),
10);
11
12$dbh = new PDO('mysql:host=xxxxx;dbname=xxxxx;charset=utf8','xxxxx','xxxxx');
13$stmt = $dbh->prepare("INSERT INTO hoge (id, name) VALUES (:id, :name)");
14$stmt->bindParam(':id', $id, PDO::PARAM_INT);
15$stmt->bindParam(':name', $name, PDO::PARAM_STR);
16
17$dbh->beginTransaction();
18foreach($data as $datum) {
19 $id = $datum['id'];
20 $name = $datum['name'];
21 $stmt->execute();
22}
23$dbh->commit();
こんな感じでどうでしょう。
クエリ部分はプリペアドステートメントで構成し、全体をトランザクション(beginTransactionとcommit)で囲んでおけばforeachでまわすのでも問題ないと思いますよ。
ひとつのINSERT文で複数の行を挿入するバルクインサートという方法もありますが、上↑の方法の方が処理が簡単で、パフォーマンスもそう変わらないと思います。
解説追記
(バインドとは・・・ここはどういった処理なのでしょうか?;;)
:idの名前がついている箇所に変数$idを紐づける操作をしています。
PHP PDOStatement::bindParam
(トランザクションを貼ると、途中でエラーが出たら、ロールバックといって処理開始時の時点までデータを戻すことができる(?))
間違ってはいないです。このケースの場合はエラー対策はもちろんですが主にDBへのI/Oを減らすために囲んでいます。
$stmt->execute(); //プリペアドステートメント開始(?)
プリペアドステートメントは$stmt = $dbh->prepare("INSERT INTO hoge (id, name) VALUES (:id, :name)");
で作っています。
execute()
はSQLの実行をしている箇所です。
PHP PDOStatement::execute
上記のececute()に引数は指定しないのでしょうか?
この書き方の場合は引数は不要です。
$datumをforeachで作っていますがその後使用しないのでしょうか?;;;
しません。使えないわけではないですが、多くの場合foreachの外では使い道はありません。
bindValueパターン
PHP
1$dbh = new PDO('mysql:host=xxxxx;dbname=xxxxx;charset=utf8','xxxxx','xxxxx');
2$stmt = $dbh->prepare("INSERT INTO hoge (id, name) VALUES (:id, :name)");
3
4$dbh->beginTransaction();
5foreach($data as $datum) {
6 $stmt->bindValue(':id', $datum['id'], PDO::PARAM_INT);
7 $stmt->bindValue(':name', $datum['name'], PDO::PARAM_STR);
8 $stmt->execute();
9}
10$dbh->commit();
bindParam()と違って値自体をバインドするので、$id、$namaの変数は使いません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/02 07:04
2016/03/02 08:36