回答編集履歴

2

bindValueパターン追記

2016/03/02 08:59

投稿

dupont_kedama
dupont_kedama

スコア925

test CHANGED
@@ -105,3 +105,37 @@
105
105
 
106
106
 
107
107
  しません。使えないわけではないですが、多くの場合foreachの外では使い道はありません。
108
+
109
+
110
+
111
+
112
+
113
+ ##### bindValueパターン
114
+
115
+
116
+
117
+ ```PHP
118
+
119
+ $dbh = new PDO('mysql:host=xxxxx;dbname=xxxxx;charset=utf8','xxxxx','xxxxx');
120
+
121
+ $stmt = $dbh->prepare("INSERT INTO hoge (id, name) VALUES (:id, :name)");
122
+
123
+
124
+
125
+ $dbh->beginTransaction();
126
+
127
+ foreach($data as $datum) {
128
+
129
+ $stmt->bindValue(':id', $datum['id'], PDO::PARAM_INT);
130
+
131
+ $stmt->bindValue(':name', $datum['name'], PDO::PARAM_STR);
132
+
133
+ $stmt->execute();
134
+
135
+ }
136
+
137
+ $dbh->commit();
138
+
139
+ ```
140
+
141
+ bindParam()と違って値自体をバインドするので、$id、$namaの変数は使いません。

1

解説追記

2016/03/02 08:59

投稿

dupont_kedama
dupont_kedama

スコア925

test CHANGED
@@ -55,3 +55,53 @@
55
55
  クエリ部分はプリペアドステートメントで構成し、全体をトランザクション(beginTransactionとcommit)で囲んでおけばforeachでまわすのでも問題ないと思いますよ。
56
56
 
57
57
  ひとつのINSERT文で複数の行を挿入するバルクインサートという方法もありますが、上↑の方法の方が処理が簡単で、パフォーマンスもそう変わらないと思います。
58
+
59
+
60
+
61
+ ##### 解説追記
62
+
63
+ > (バインドとは・・・ここはどういった処理なのでしょうか?;;)
64
+
65
+
66
+
67
+ :idの名前がついている箇所に変数$idを紐づける操作をしています。
68
+
69
+ [PHP PDOStatement::bindParam](http://php.net/manual/ja/pdostatement.bindparam.php)
70
+
71
+
72
+
73
+
74
+
75
+ > (トランザクションを貼ると、途中でエラーが出たら、ロールバックといって処理開始時の時点までデータを戻すことができる(?))
76
+
77
+
78
+
79
+ 間違ってはいないです。このケースの場合はエラー対策はもちろんですが主にDBへのI/Oを減らすために囲んでいます。
80
+
81
+
82
+
83
+ > $stmt->execute(); //プリペアドステートメント開始(?)
84
+
85
+
86
+
87
+ プリペアドステートメントは`$stmt = $dbh->prepare("INSERT INTO hoge (id, name) VALUES (:id, :name)");`で作っています。
88
+
89
+ `execute()`はSQLの実行をしている箇所です。
90
+
91
+ [PHP PDOStatement::execute](http://php.net/manual/ja/pdostatement.execute.php)
92
+
93
+
94
+
95
+ > 上記のececute()に引数は指定しないのでしょうか?
96
+
97
+
98
+
99
+ この書き方の場合は引数は不要です。
100
+
101
+
102
+
103
+ > $datumをforeachで作っていますがその後使用しないのでしょうか?;;;
104
+
105
+
106
+
107
+ しません。使えないわけではないですが、多くの場合foreachの外では使い道はありません。