質問編集履歴

3

修正

2020/06/29 02:35

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -74,13 +74,7 @@
74
74
 
75
75
  // wp_fruits1 を保存
76
76
 
77
- $table = 'wp_fruits1';
78
-
79
- $data = $fruits_datas['fruits1'];
80
-
81
- $format = ['%s'];
82
-
83
- $fruits1 = $wpdb->insert( $table, $data, $format );
77
+ $fruits1 = $wpdb->insert( 'wp_fruits1', $fruits_datas['fruits1'], ['%s'] );
84
78
 
85
79
  if( ! $fruits1 ){
86
80
 
@@ -94,13 +88,7 @@
94
88
 
95
89
  // wp_fruits2 を保存
96
90
 
97
- $table = 'wp_fruits2';
98
-
99
- $data = $fruits_datas['fruits2'];
100
-
101
- $format = ['%s'];
102
-
103
- $fruits2 = $wpdb->insert( $table, $data, $format );
91
+ $fruits2 = $wpdb->insert( 'wp_fruits2', $fruits_datas['fruits2'], ['%s'] );
104
92
 
105
93
  if( ! $fruits2 ){
106
94
 
@@ -180,13 +168,7 @@
180
168
 
181
169
  // wp_vegetables1 を保存
182
170
 
183
- $table = 'wp_vegetables1';
184
-
185
- $data = $vegetable_datas['vegetables1'];
186
-
187
- $format = ['%s'];
188
-
189
- $vegetables1 = $wpdb->insert( $table, $data, $format );
171
+ $vegetables1 = $wpdb->insert( 'wp_vegetables1', $vegetable_datas['vegetables1'], ['%s'] );
190
172
 
191
173
  if( ! $vegetables1 ){
192
174
 
@@ -200,13 +182,7 @@
200
182
 
201
183
  // wp_vegetables2 を保存
202
184
 
203
- $table = 'wp_vegetables2';
204
-
205
- $data = $vegetable_datas['vegetables2'];
206
-
207
- $format = ['%s'];
208
-
209
- $vegetables2 = $wpdb->insert( $table, $data, $format );
185
+ $vegetables2 = $wpdb->insert( 'wp_vegetables2', $vegetable_datas['wp_vegetables2'], ['%s'] );
210
186
 
211
187
  if( ! $vegetables2 ){
212
188
 

2

コード誤字訂正

2020/06/29 02:35

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -18,11 +18,11 @@
18
18
 
19
19
 
20
20
 
21
- さて以下1行目の`$val`は、子関数の最後に更新される`wp_vegetables2`テーブルを更新する値ですが、ここを`CREATE`で設定した`VARCHAR(3)`以上の文字にしてエラーを起こしてみました。
21
+ さて以下5行目の`$val`は、子関数の最後に更新される`wp_vegetables2`テーブルを更新する値ですが、ここを`CREATE`で設定した`VARCHAR(3)`以上の文字にしてエラーを起こしてみました。
22
-
23
-
24
-
22
+
23
+
24
+
25
- しかし`ROLLBACK`が効くのは子関数で`LOCK TABLES`をかけた`wp_vegetables1`と`wp_vegetables2`だけでし
25
+ しかし`ROLLBACK`が効くのは子関数で`LOCK TABLES`をかけた`wp_vegetables1`と`wp_vegetables2`だけで、`wp_fruits1`と`wp_fruits2`はINSERTが成功てしまうのです
26
26
 
27
27
 
28
28
 
@@ -112,6 +112,8 @@
112
112
 
113
113
 
114
114
 
115
+ // 以下の子関数でエラーが出たとき、親関数を ROLLBACK させたい
116
+
115
117
  $vegetable_ids = my_insert_wp_vegetables($vegetable_datas);
116
118
 
117
119
  if( isset($vegetable_ids['error']) ){
@@ -126,7 +128,7 @@
126
128
 
127
129
 
128
130
 
129
- // 問題なければ
131
+ // 問題なければ
130
132
 
131
133
  $result = ['fruits1_id'=>$fruits1_id,'fruits2_id'=>$fruits2_id];
132
134
 
@@ -136,21 +138,21 @@
136
138
 
137
139
 
138
140
 
139
- } catch (Exception $e) {
141
+ } catch (Exception $e) {
140
142
 
141
143
  $wpdb->query('ROLLBACK');
142
144
 
143
- $result = $e->getMessage();
145
+ $result['error'] = $e->getMessage();
144
-
146
+
145
- } finally {
147
+ } finally {
146
-
148
+
147
- $wpdb->query('UNLOCK TABLES');
149
+ $wpdb->query('UNLOCK TABLES');
148
-
150
+
149
- }
151
+ }
150
-
151
-
152
-
152
+
153
+
154
+
153
- return $result;
155
+ return $result;
154
156
 
155
157
  }
156
158
 
@@ -170,9 +172,9 @@
170
172
 
171
173
 
172
174
 
173
- $result = null;
175
+ $result = null;
174
-
176
+
175
- try {
177
+ try {
176
178
 
177
179
 
178
180
 
@@ -228,21 +230,21 @@
228
230
 
229
231
 
230
232
 
231
- } catch (Exception $e) {
233
+ } catch (Exception $e) {
232
234
 
233
235
  $wpdb->query('ROLLBACK');
234
236
 
235
- $result = $e->getMessage();
237
+ $result['error'] = $e->getMessage();
236
-
238
+
237
- } finally {
239
+ } finally {
238
-
240
+
239
- $wpdb->query('UNLOCK TABLES');
241
+ $wpdb->query('UNLOCK TABLES');
240
-
242
+
241
- }
243
+ }
242
-
243
-
244
-
244
+
245
+
246
+
245
- return $result;
247
+ return $result;
246
248
 
247
249
  }
248
250
 

1

加筆

2020/06/29 02:33

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  // 実行
42
42
 
43
- $val = 'val'; // ここを VARCHAR(3) 以上の文字にしてエラーを起こしても、wp_fruits1 と wp_fruits2 は `ROLLBACK`が効かない
43
+ $val = 'val'; // ここを VARCHAR(3) 以上の文字にしてエラーを起こしても、wp_fruits1 と wp_fruits2 は ROLLBACK が効かない
44
44
 
45
45
  $fruits_datas = [ 'fruits1'=>['col'=>'val'], 'fruits2'=>['col'=>'val'] ];
46
46
 
@@ -52,9 +52,9 @@
52
52
 
53
53
 
54
54
 
55
- // wp_fruits1 と wp_fruits2 を INSERT
55
+ // 親関数 ( wp_fruits1 と wp_fruits2 を INSERT )
56
-
56
+
57
- function my_insert_wp_fruits($fruits_datas,$vegetable_datas){
57
+ function my_insert_wp_fruits($fruits_datas,$vegetable_datas=[]){
58
58
 
59
59
  global $wpdb;
60
60
 
@@ -156,7 +156,7 @@
156
156
 
157
157
 
158
158
 
159
- // wp_vegetables1 と wp_vegetables2 を INSERT
159
+ // 子関数 ( wp_vegetables1 と wp_vegetables2 を INSERT )
160
160
 
161
161
  function my_insert_wp_vegetables($vegetable_datas){
162
162
 
@@ -281,3 +281,47 @@
281
281
 
282
282
 
283
283
  ```
284
+
285
+ ###試したこと
286
+
287
+ 自分なりの解決策としては、親関数の方で、「もし子関数を更新するならLOCK TABLESを追加」というコードを下記のように加える方法ですが…
288
+
289
+
290
+
291
+ こういった方法よりも、親関数にさかのぼって`ROLLBACK`させたいと思っています。
292
+
293
+
294
+
295
+ ご指導宜しくお願い申し上げます。
296
+
297
+ ```php
298
+
299
+ function my_insert_wp_fruits($fruits_datas,$vegetable_datas=[]){
300
+
301
+ global $wpdb;
302
+
303
+ $wpdb->query('SET autocommit=0');
304
+
305
+ $sql = "LOCK TABLES wp_fruits1 WRITE, wp_fruits2 WRITE";
306
+
307
+
308
+
309
+ // もし子関数を更新するならLOCK TABLESを追加
310
+
311
+ if( !empty($vegetable_datas) ){
312
+
313
+ $sql .= ",wp_vegetables1 WRITE, wp_vegetables2 WRITE"
314
+
315
+ }
316
+
317
+
318
+
319
+ $wpdb->query($sql);
320
+
321
+
322
+
323
+ // 以下同じ
324
+
325
+ }
326
+
327
+ ```