teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

修正

2019/04/26 06:09

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -13,6 +13,7 @@
13
13
  関数を用意
14
14
  ```php
15
15
  function connection(){
16
+ return new PDO(xxxxx); //ここは自身の設定を反映すること
16
17
  }
17
18
  function createInsertSQL(string $table,array $item):string
18
19
  {

4

修正

2019/04/26 06:09

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -76,7 +76,8 @@
76
76
  $set2 = ['item3'=>3,'item4'=>4];
77
77
  $sqls[] = createInsertSQL('DB02',$set2);
78
78
 
79
- $stmt = $pdo->prepare(implode(';',$sqls));
79
+ $stmt = $pdo->prepare(implode(';',$sqls),
80
+ array(PDO::MYSQL_ATTR_MULTI_STATEMENTS=>true));
80
81
  stmtBind($stmt,array_merge($set,$set2));
81
82
 
82
83
  if(!$stmt->execute()){

3

修正

2019/04/26 03:09

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -16,7 +16,6 @@
16
16
  }
17
17
  function createInsertSQL(string $table,array $item):string
18
18
  {
19
- $pdo = connection();
20
19
  $clms = [];
21
20
  $values = [];
22
21
  foreach($item as $clm=>$value){
@@ -34,9 +33,12 @@
34
33
  ```
35
34
 
36
35
  1個ずつ実行
36
+ ---
37
37
  ```php
38
38
  try{
39
39
  $pdo = connection();
40
+ $pdo->beginTransaction();
41
+
40
42
  $table = 'DB01';
41
43
  $set = ['item1'=>1,'item2'=>2];
42
44
  $stmt = $pdo->prepare(createInsertSQL($table,$set));
@@ -60,9 +62,12 @@
60
62
  ```
61
63
 
62
64
  まとめて実行
65
+ ---
63
66
  ```php
64
67
  try{
65
68
  $pdo = connection();
69
+ $pdo->beginTransaction();
70
+
66
71
  $sqls = [];
67
72
 
68
73
  $set1 = ['item1'=>1,'item2'=>2];

2

修正

2019/04/26 03:05

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -5,4 +5,81 @@
5
5
  「可変になるところ」を引数にした関数を作ると良いです。
6
6
  そこは考えてやってみてください。(「可能か?」という質問なので)
7
7
 
8
- あと既に指摘があるようにパラメータだけ指定して[bindValue](https://www.php.net/manual/ja/pdostatement.bindvalue.php)による値のbindが行われていないためのエラーが起きてるのではないでしょうか。
8
+ あと既に指摘があるようにパラメータだけ指定して[bindValue](https://www.php.net/manual/ja/pdostatement.bindvalue.php)による値のbindが行われていないためのエラーが起きてるのではないでしょうか。
9
+
10
+ サンプル(※動作未検証)
11
+ ----
12
+
13
+ 関数を用意
14
+ ```php
15
+ function connection(){
16
+ }
17
+ function createInsertSQL(string $table,array $item):string
18
+ {
19
+ $pdo = connection();
20
+ $clms = [];
21
+ $values = [];
22
+ foreach($item as $clm=>$value){
23
+ $clms[] = $clm;
24
+ $values[] = ':'.$clm;
25
+ }
26
+ return "insert into {$table} (".implode(',',$clms).") VALUES (".implode(',',$values).")";
27
+ }
28
+ function stmtBind(PDOStatement $stmt,array $item)
29
+ {
30
+ foreach($item as $clm=>$value){
31
+ $stmt->bindValue(':'.$clm, $value);
32
+ }
33
+ }
34
+ ```
35
+
36
+ 1個ずつ実行
37
+ ```php
38
+ try{
39
+ $pdo = connection();
40
+ $table = 'DB01';
41
+ $set = ['item1'=>1,'item2'=>2];
42
+ $stmt = $pdo->prepare(createInsertSQL($table,$set));
43
+ stmtBind($stmt,$set);
44
+
45
+ if(!$stmt->execute()){
46
+ throw new PDOException();
47
+ }
48
+ $table = 'DB02';
49
+ $set = ['item3'=>3,'item4'=>4];
50
+ $stmt = $pdo->prepare(createInsertSQL($table,$set));
51
+ stmtBind($stmt,$set);
52
+ if(!$stmt->execute()){
53
+ throw new PDOException();
54
+ }
55
+ $pdo->commit();
56
+ }catch(PDOException $e){
57
+ $pdo->rollBack();
58
+ die(json_encode($e));
59
+ }
60
+ ```
61
+
62
+ まとめて実行
63
+ ```php
64
+ try{
65
+ $pdo = connection();
66
+ $sqls = [];
67
+
68
+ $set1 = ['item1'=>1,'item2'=>2];
69
+ $sqls[] = createInsertSQL('DB01',$set1);
70
+
71
+ $set2 = ['item3'=>3,'item4'=>4];
72
+ $sqls[] = createInsertSQL('DB02',$set2);
73
+
74
+ $stmt = $pdo->prepare(implode(';',$sqls));
75
+ stmtBind($stmt,array_merge($set,$set2));
76
+
77
+ if(!$stmt->execute()){
78
+ throw new PDOException();
79
+ }
80
+ $pdo->commit();
81
+ }catch(PDOException $e){
82
+ $pdo->rollBack();
83
+ die(json_encode($e));
84
+ }
85
+ ```

1

修正

2019/04/26 03:00

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -3,6 +3,6 @@
3
3
  できます。
4
4
 
5
5
  「可変になるところ」を引数にした関数を作ると良いです。
6
- そこは考えてやってみてください。
6
+ そこは考えてやってみてください。(「可能か?」という質問なので)
7
7
 
8
8
  あと既に指摘があるようにパラメータだけ指定して[bindValue](https://www.php.net/manual/ja/pdostatement.bindvalue.php)による値のbindが行われていないためのエラーが起きてるのではないでしょうか。