質問編集履歴

6

コードの誤字を修正

2020/05/31 06:00

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  ];
102
102
 
103
- $result_sub = test_insert_sql_row( $sub_table, $update_info );
103
+ $result_sub = test_insert_sql_row( 'wp_sub1s', $update_info );
104
104
 
105
105
  // エラー
106
106
 

5

コードの不要な行を削除

2020/05/31 06:00

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -54,8 +54,6 @@
54
54
 
55
55
  $wpdb->query("START TRANSACTION");
56
56
 
57
- $sub_table = 'wp_sub1s';
58
-
59
57
  $wpdb->query("LOCK TABLES wp_mains WRITE, wp_sub1s WRITE");
60
58
 
61
59
 

4

コードの誤字を修正

2020/05/31 05:58

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -74,8 +74,6 @@
74
74
 
75
75
  $result_main = test_insert_sql_row( 'wp_mains', $update_info );
76
76
 
77
- $result['result_main'] = $result_main;
78
-
79
77
  // エラー
80
78
 
81
79
  if( !empty($result_main['errors']) ){
@@ -86,10 +84,16 @@
86
84
 
87
85
 
88
86
 
89
- // wp_mains テーブル が無事入ったら wp_subs テーブルを更新
87
+ // wp_mains テーブル が無事入ったら
90
88
 
91
89
  else{
92
90
 
91
+ $result['insert_id'] = $result_main['insert_id'];
92
+
93
+
94
+
95
+ // wp_subs テーブルを更新
96
+
93
97
  $update_info = [
94
98
 
95
99
  'mains_ID' => 999 // $result_main['insert_id'] を渡せばエラーにならないが、999 は外部キーとして存在しないのでエラーになる

3

コードを最小限に修正

2020/05/31 00:03

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- ソースコードは以下で、`wp_sub1s`の`title`絵文字が許可されていないので、`'????タイトル'`の保存はエラーになります。
15
+ ソースコードは以下で、`wp_sub1s`の`mains_ID`は外部キーであり、存在しない`999`の保存はエラーになります。
16
16
 
17
17
 
18
18
 
@@ -32,13 +32,13 @@
32
32
 
33
33
  // wp_mains と wp_sub1s にレコードを保存する
34
34
 
35
- $result = test_insert_table( 'sub1' );
35
+ $result = test_insert_table();
36
36
 
37
37
  var_dump($result);
38
38
 
39
39
 
40
40
 
41
- function test_insert_table( $post_type ){
41
+ function test_insert_table(){
42
42
 
43
43
  global $wpdb;
44
44
 
@@ -46,7 +46,7 @@
46
46
 
47
47
  // 戻り値
48
48
 
49
- $result = ['insert_id'=>null,'errors'=>[]]; // $result['errors'] にエラーがあれば ROLLBACK したい
49
+ $result = ['insert_id'=>null,'errors'=>[]]; // $result['errors'] にエラーがあれば ROLLBACK する
50
50
 
51
51
 
52
52
 
@@ -54,11 +54,9 @@
54
54
 
55
55
  $wpdb->query("START TRANSACTION");
56
56
 
57
- $sub_table = 'wp_' . $post_type . 's';
57
+ $sub_table = 'wp_sub1s';
58
-
58
+
59
- $sql = "LOCK TABLES wp_mains WRITE, $sub_table WRITE";
59
+ $wpdb->query("LOCK TABLES wp_mains WRITE, wp_sub1s WRITE");
60
-
61
- $wpdb->query($sql);
62
60
 
63
61
 
64
62
 
@@ -74,219 +72,223 @@
74
72
 
75
73
  ];
76
74
 
77
- $insert_id = test_insert_sql_row( 'wp_mains', $update_info );
75
+ $result_main = test_insert_sql_row( 'wp_mains', $update_info );
76
+
77
+ $result['result_main'] = $result_main;
78
+
79
+ // エラー
80
+
81
+ if( !empty($result_main['errors']) ){
82
+
83
+ $result['errors']['$result_main'] = $result_main;
84
+
85
+ }
86
+
87
+
88
+
89
+ // wp_mains テーブル が無事入ったら wp_subs テーブルを更新
90
+
91
+ else{
92
+
93
+ $update_info = [
94
+
95
+ 'mains_ID' => 999 // $result_main['insert_id'] を渡せばエラーにならないが、999 は外部キーとして存在しないのでエラーになる
96
+
97
+ ,'title' => 'タイトル'
98
+
99
+ ];
100
+
101
+ $result_sub = test_insert_sql_row( $sub_table, $update_info );
102
+
103
+ // エラー
104
+
105
+ if( !empty($result_sub['errors']) ){
106
+
107
+ $result['errors']['$result_sub'] = $result_sub;
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+ // エラーなら ROLLBACK する
116
+
117
+ if( !empty($result['errors']) ){
118
+
119
+ $wpdb->query('ROLLBACK'); // ここで ROLLBACK が効かず、wp_mains にだけ値が入ってしまうのが問題です
120
+
121
+ error_log( 'test_insert_table() - $result = '. json_encode($result, JSON_UNESCAPED_UNICODE) );
122
+
123
+ }else{
124
+
125
+ $wpdb->query('COMMIT');
126
+
127
+ }
128
+
129
+ }catch( Exception $e ){
130
+
131
+ $wpdb->query('ROLLBACK');
132
+
133
+ }finally{
134
+
135
+ $wpdb->query('UNLOCK TABLES');
136
+
137
+ }
138
+
139
+
140
+
141
+ return $result;
142
+
143
+ }
144
+
145
+
146
+
147
+ function test_insert_sql_row( $table_name, $update_info ){
148
+
149
+ global $wpdb;
150
+
151
+
152
+
153
+ // 戻り値
154
+
155
+ $result = ['insert_id'=>null,'errors'=>[]];
156
+
157
+
158
+
159
+ // 値の型
160
+
161
+ $format_arr = [];
162
+
163
+ foreach ( $update_info as $v ) {
164
+
165
+ $type = gettype( $v );
166
+
167
+ if ( $type == 'string' ) {
168
+
169
+ $format = '%s';
170
+
171
+ } elseif ( $type == 'integer' ) {
172
+
173
+ $format = '%d';
174
+
175
+ }
176
+
177
+ $format_arr[] = $format;
178
+
179
+ }
180
+
181
+
182
+
183
+ // 保存
184
+
185
+ $rows = $wpdb->insert( $table_name, $update_info, $format_arr );
186
+
187
+ // エラーがあればその内容を入れる
188
+
189
+ if( ! $rows ){
190
+
191
+ $result['errors'] = [
192
+
193
+ '$rows' => $rows
194
+
195
+ ,'$wpdb->last_query' => $wpdb->last_query
196
+
197
+ ,'$wpdb->last_error' => $wpdb->last_error
198
+
199
+ ,'$wpdb->last_result' => $wpdb->last_result
200
+
201
+ ,'$wpdb->col_info' => $wpdb->col_info
202
+
203
+ ,'$wpdb->insert_id' => $wpdb->insert_id
204
+
205
+ ];
206
+
207
+ }
208
+
209
+ // エラーがなければIDを入れる
210
+
211
+ else{
212
+
213
+ $insert_id = $wpdb->insert_id;
78
214
 
79
215
  $result['insert_id'] = $insert_id;
80
216
 
81
- // エラー
82
-
83
- if( !empty($insert_id['errors']) ){
84
-
85
- $result['errors']['$insert_id'] = $insert_id;
86
-
87
- }
88
-
89
-
90
-
91
- // wp_mains テーブル が無事入ったら wp_subs テーブルを更新
92
-
93
- else{
94
-
95
- $update_info = [
96
-
97
- 'mains_ID' => $insert_id
98
-
99
- ,'title' => '????タイトル' // wp_sub1s の title には絵文字が許可されていないので、これはエラーになる
100
-
101
- ];
102
-
103
- $insert_id_sub = test_insert_sql_row( $sub_table, $update_info );
104
-
105
- // エラー
106
-
107
- if( !empty($insert_id_sub['errors']) ){
108
-
109
- $result['errors']['$insert_id_sub'] = $insert_id_sub;
110
-
111
- }
112
-
113
- }
114
-
115
-
116
-
117
- // 絵文字があるため次のエラーに該当する
118
-
119
- if( !empty($result['errors']) ){
120
-
121
- $wpdb->query('ROLLBACK'); // ここで ROLLBACK が効かず、wp_mains にだけ値が入ってしまうのが問題です
122
-
123
- error_log( 'test_insert_table() - $result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );
124
-
125
- }else{
126
-
127
- $wpdb->query('COMMIT');
128
-
129
- }
130
-
131
- }catch( Exception $e ){
132
-
133
- $wpdb->query('ROLLBACK');
134
-
135
- }finally{
136
-
137
- $wpdb->query('UNLOCK TABLES');
138
-
139
217
  }
140
218
 
141
-
142
-
143
- return $result;
219
+ return $result;
144
-
220
+
145
- }
221
+ }
222
+
223
+
224
+
146
-
225
+ ```
226
+
147
-
227
+ テーブルのCREATEは以下です。
228
+
148
-
229
+ ```PHP
230
+
231
+ test_create_table();
232
+
149
- function test_insert_sql_row( $table_name, $update_info ){
233
+ function test_create_table(){
150
234
 
151
235
  global $wpdb;
152
236
 
153
-
154
-
155
- // 戻り値
156
-
157
- $result = ['insert_id'=>null,'errors'=>[]];
158
-
159
-
160
-
161
- // 値の型
162
-
163
- $format_arr = [];
164
-
165
- foreach ( $update_info as $v ) {
166
-
167
- $type = gettype( $v );
168
-
169
- if ( $type == 'string' ) {
170
-
171
- $format = '%s';
172
-
173
- } elseif ( $type == 'integer' ) {
174
-
175
- $format = '%d';
176
-
177
- }
178
-
179
- $format_arr[] = $format;
180
-
181
- }
182
-
183
-
184
-
185
- // 保存
186
-
187
- $rows = $wpdb->insert( $table_name, $update_info, $format_arr );
188
-
189
- // エラーがあればその内容を入れる
190
-
191
- if( ! $rows ){
192
-
193
- $result['errors'] = [
194
-
195
- '$rows' => $rows
196
-
197
- ,'$wpdb->last_query' => $wpdb->last_query
198
-
199
- ,'$wpdb->last_error' => $wpdb->last_error
200
-
201
- ,'$wpdb->last_result' => $wpdb->last_result
202
-
203
- ,'$wpdb->col_info' => $wpdb->col_info
204
-
205
- ,'$wpdb->insert_id' => $wpdb->insert_id
206
-
207
- ];
208
-
209
- }
210
-
211
- // エラーがなければIDを入れる
212
-
213
- else{
214
-
215
- $insert_id = $wpdb->insert_id;
216
-
217
- $result['insert_id'] = $insert_id;
218
-
219
- }
220
-
221
- return $result;
237
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // dbDelta() のため必要
238
+
239
+
240
+
241
+ // wp_mains テーブルを作成
242
+
243
+ $sql = "CREATE TABLE wp_mains (
244
+
245
+ `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
246
+
247
+ ,`users_ID` BIGINT(20) UNSIGNED NOT NULL
248
+
249
+ ,`content` VARCHAR(1000)
250
+
251
+ ,PRIMARY KEY (`ID`)
252
+
253
+ ,FOREIGN KEY (`users_ID`) REFERENCES wp_users(`ID`)
254
+
255
+ );";
256
+
257
+ add_option($table_name."_version", '1.0');
258
+
259
+ dbDelta($sql);
260
+
261
+
262
+
263
+ // wp_sub1s テーブルを作成
264
+
265
+ $sql = "CREATE TABLE wp_sub1s (
266
+
267
+ `mains_ID` BIGINT(20) UNSIGNED NOT NULL
268
+
269
+ ,`title` VARCHAR(50) NOT NULL
270
+
271
+ ,PRIMARY KEY (`mains_ID`)
272
+
273
+ ,FOREIGN KEY (`mains_ID`) REFERENCES wp_mains(`ID`)
274
+
275
+ );";
276
+
277
+ add_option($table_name."_version", '1.0');
278
+
279
+ dbDelta($sql);
222
280
 
223
281
  }
224
282
 
225
-
226
-
227
283
  ```
228
284
 
229
- テーブルのCREATEは以下です。
230
-
231
- ```PHP
232
-
233
- test_create_table();
234
-
235
- function test_create_table(){
236
-
237
- global $wpdb;
238
-
239
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // dbDelta() のため必要
240
-
241
-
242
-
243
- // wp_mains テーブルを作成
244
-
245
- $sql = "CREATE TABLE wp_mains (
246
-
247
- `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
248
-
249
- ,`users_ID` BIGINT(20) UNSIGNED NOT NULL
250
-
251
- ,`content` VARCHAR(1000)
252
-
253
- ,PRIMARY KEY (`ID`)
254
-
255
- ,FOREIGN KEY (`users_ID`) REFERENCES wp_users(`ID`)
256
-
257
- );";
258
-
259
- add_option($table_name."_version", '1.0');
260
-
261
- dbDelta($sql);
262
-
263
-
264
-
265
- // wp_sub1s テーブルを作成
266
-
267
- $sql = "CREATE TABLE wp_sub1s (
268
-
269
- `mains_ID` BIGINT(20) UNSIGNED NOT NULL
270
-
271
- ,`title` VARCHAR(50) NOT NULL
272
-
273
- ,PRIMARY KEY (`mains_ID`)
274
-
275
- ,FOREIGN KEY (`mains_ID`) REFERENCES wp_mains(`ID`)
276
-
277
- );";
278
-
279
- add_option($table_name."_version", '1.0');
280
-
281
- dbDelta($sql);
282
-
283
- }
284
-
285
- ```
286
-
287
285
  ###試したこと
288
286
 
287
+ まず上記ソースコードにありますが、`999`でなく`$result_main['insert_id']`を渡せばエラーにならず、`wp_mains`も`wp_sub1s`も問題なく入りました。
288
+
289
+
290
+
289
- 上記ソースコードありますが、ROLLBACKすべき条件分岐に差し掛かってることを確認するため`error_log( '$result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって`// 絵文字があるため次のエラーに該当する`というのは分岐できているようです。
291
+ にROLLBACKすべき条件分岐に差し掛かってかどうかを確認するため`error_log( '$result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって`// エラーなら ROLLBACK する`というのは分岐できているようです。
290
292
 
291
293
 
292
294
 

2

コードを最小限に修正

2020/05/31 00:00

投稿

yakan
yakan

スコア19

test CHANGED
@@ -1 +1 @@
1
- WordPress$wpdb->query('ROLLBACK'); が効かず、一部のテーブルだけが更新されてしまう
1
+ MySQL で ROLLBACK が効かず、一部のテーブルだけが更新されてしまう ( WordPress )
test CHANGED
@@ -32,43 +32,37 @@
32
32
 
33
33
  // wp_mains と wp_sub1s にレコードを保存する
34
34
 
35
- test_insert_table( 'sub1' );
35
+ $result = test_insert_table( 'sub1' );
36
+
37
+ var_dump($result);
38
+
39
+
36
40
 
37
41
  function test_insert_table( $post_type ){
38
42
 
39
43
  global $wpdb;
40
44
 
45
+
46
+
47
+ // 戻り値
48
+
49
+ $result = ['insert_id'=>null,'errors'=>[]]; // $result['errors'] にエラーがあれば ROLLBACK したい
50
+
41
51
 
42
52
 
43
53
  // トランザクションとロックするテーブル
44
54
 
45
- $wpdb->query("START TRANSACTION");
55
+ $wpdb->query("START TRANSACTION");
46
56
 
47
57
  $sub_table = 'wp_' . $post_type . 's';
48
58
 
49
59
  $sql = "LOCK TABLES wp_mains WRITE, $sub_table WRITE";
50
60
 
51
- $wpdb->query($sql);
61
+ $wpdb->query($sql);
52
-
53
-
54
-
55
- // $inserted の error_info が空でなければ ROLLBACK する
62
+
56
-
57
- $inserted = [
63
+
58
-
59
- 'error_wrapper'=>[
64
+
60
-
61
- 'func' => 'test_insert_table()'
62
-
63
- ,'args' => [ '$post_type'=>$post_type ]
64
-
65
- ,'error_info' => []
66
-
67
- ]
68
-
69
- ];
70
-
71
- try{
65
+ try{
72
66
 
73
67
  // wp_mains テーブルを更新
74
68
 
@@ -80,62 +74,60 @@
80
74
 
81
75
  ];
82
76
 
83
- $insert_id = my_insert_sql_row( 'wp_mains', $update_info );
77
+ $insert_id = test_insert_sql_row( 'wp_mains', $update_info );
78
+
84
-
79
+ $result['insert_id'] = $insert_id;
80
+
81
+ // エラー
82
+
85
- if( my_is_error_info($insert_id) ){
83
+ if( !empty($insert_id['errors']) ){
86
-
84
+
87
- $inserted['error_wrapper']['error_info']['$insert_id'] = $insert_id;
85
+ $result['errors']['$insert_id'] = $insert_id;
86
+
87
+ }
88
+
89
+
90
+
91
+ // wp_mains テーブル が無事入ったら wp_subs テーブルを更新
92
+
93
+ else{
94
+
95
+ $update_info = [
96
+
97
+ 'mains_ID' => $insert_id
98
+
99
+ ,'title' => '????タイトル' // wp_sub1s の title には絵文字が許可されていないので、これはエラーになる
100
+
101
+ ];
102
+
103
+ $insert_id_sub = test_insert_sql_row( $sub_table, $update_info );
104
+
105
+ // エラー
106
+
107
+ if( !empty($insert_id_sub['errors']) ){
108
+
109
+ $result['errors']['$insert_id_sub'] = $insert_id_sub;
110
+
111
+ }
112
+
113
+ }
114
+
115
+
116
+
117
+ // 絵文字があるため次のエラーに該当する
118
+
119
+ if( !empty($result['errors']) ){
120
+
121
+ $wpdb->query('ROLLBACK'); // ここで ROLLBACK が効かず、wp_mains にだけ値が入ってしまうのが問題です
122
+
123
+ error_log( 'test_insert_table() - $result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );
88
124
 
89
125
  }else{
90
126
 
91
- // wp_subs テーブルを更新
92
-
93
- $update_info;
94
-
95
- if( $post_type === 'sub1' ){
127
+ $wpdb->query('COMMIT');
96
-
97
- $update_info = [
98
-
99
- 'mains_ID' => $insert_id
100
-
101
- ,'title' => '????タイトル'
102
-
103
- ];
104
-
105
- }elseif( $post_type === 'sub2' ){
106
-
107
- // 割愛
108
-
109
- }
110
-
111
- $insert_id_sub = my_insert_sql_row( $sub_table, $update_info );
112
-
113
- if( my_is_error_info($insert_id_sub) ){
114
-
115
- $inserted['error_wrapper']['error_info']['$insert_id_sub'] = $insert_id_sub;
116
-
117
- }
118
128
 
119
129
  }
120
130
 
121
-
122
-
123
- // エラー
124
-
125
- if( my_is_error_info( $inserted ) ){
126
-
127
- $wpdb->query('ROLLBACK'); // ここでROLLBACKが効かず、wp_mainsにだけ値が入ってしまうのが問題です
128
-
129
- error_log( '$inserted = '. json_encode($inserted, JSON_UNESCAPED_UNICODE) );
130
-
131
- return $inserted;
132
-
133
- }else{
134
-
135
- $wpdb->query('COMMIT');
136
-
137
- }
138
-
139
131
  }catch( Exception $e ){
140
132
 
141
133
  $wpdb->query('ROLLBACK');
@@ -146,219 +138,159 @@
146
138
 
147
139
  }
148
140
 
149
-
150
-
141
+
142
+
151
- return $insert_id;
143
+ return $result;
144
+
145
+ }
146
+
147
+
148
+
149
+ function test_insert_sql_row( $table_name, $update_info ){
150
+
151
+ global $wpdb;
152
+
153
+
154
+
155
+ // 戻り値
156
+
157
+ $result = ['insert_id'=>null,'errors'=>[]];
158
+
159
+
160
+
161
+ // 値の型
162
+
163
+ $format_arr = [];
164
+
165
+ foreach ( $update_info as $v ) {
166
+
167
+ $type = gettype( $v );
168
+
169
+ if ( $type == 'string' ) {
170
+
171
+ $format = '%s';
172
+
173
+ } elseif ( $type == 'integer' ) {
174
+
175
+ $format = '%d';
176
+
177
+ }
178
+
179
+ $format_arr[] = $format;
180
+
181
+ }
182
+
183
+
184
+
185
+ // 保存
186
+
187
+ $rows = $wpdb->insert( $table_name, $update_info, $format_arr );
188
+
189
+ // エラーがあればその内容を入れる
190
+
191
+ if( ! $rows ){
192
+
193
+ $result['errors'] = [
194
+
195
+ '$rows' => $rows
196
+
197
+ ,'$wpdb->last_query' => $wpdb->last_query
198
+
199
+ ,'$wpdb->last_error' => $wpdb->last_error
200
+
201
+ ,'$wpdb->last_result' => $wpdb->last_result
202
+
203
+ ,'$wpdb->col_info' => $wpdb->col_info
204
+
205
+ ,'$wpdb->insert_id' => $wpdb->insert_id
206
+
207
+ ];
208
+
209
+ }
210
+
211
+ // エラーがなければIDを入れる
212
+
213
+ else{
214
+
215
+ $insert_id = $wpdb->insert_id;
216
+
217
+ $result['insert_id'] = $insert_id;
218
+
219
+ }
220
+
221
+ return $result;
152
222
 
153
223
  }
154
224
 
155
225
 
156
226
 
227
+ ```
228
+
229
+ テーブルのCREATEは以下です。
230
+
231
+ ```PHP
232
+
157
- // レコードを保存
233
+ test_create_table();
158
-
234
+
159
- function my_insert_sql_row( $table_name, $update_info ){
235
+ function test_create_table(){
160
236
 
161
237
  global $wpdb;
162
238
 
163
-
164
-
165
- $insert_id = [
166
-
167
- 'error_wrapper'=>[
168
-
169
- 'func' => 'my_insert_sql_row()'
170
-
171
- ,'args' => [ '$table_name'=>$table_name, '$update_info'=>$update_info ]
172
-
173
- ,'error_info' => []
174
-
175
- ]
176
-
177
- ];
178
-
179
-
180
-
181
- foreach ( $update_info as $v ) {
182
-
183
- $format_arr[] = my_get_sql_format($v);
184
-
185
- }
186
-
187
-
188
-
189
- $rows = $wpdb->insert( $table_name, $update_info, $format_arr );
190
-
191
- if( $rows !== false ){
192
-
193
- $insert_id = $wpdb->insert_id;
194
-
195
- }
196
-
197
- return $insert_id;
198
-
199
- }
200
-
201
-
202
-
203
- // 保存値の型を取得
204
-
205
- function my_get_sql_format( $v ){
206
-
207
- $format;
208
-
209
- $type = gettype( $v );
210
-
211
- if ( $type == 'string' ) {
212
-
213
- $format = '%s';
214
-
215
- } elseif ( $type == 'integer' ) {
216
-
217
- $format = '%d';
218
-
219
- }
220
-
221
- return $format;
239
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // dbDelta() のため必要
240
+
241
+
242
+
243
+ // wp_mains テーブルを作成
244
+
245
+ $sql = "CREATE TABLE wp_mains (
246
+
247
+ `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
248
+
249
+ ,`users_ID` BIGINT(20) UNSIGNED NOT NULL
250
+
251
+ ,`content` VARCHAR(1000)
252
+
253
+ ,PRIMARY KEY (`ID`)
254
+
255
+ ,FOREIGN KEY (`users_ID`) REFERENCES wp_users(`ID`)
256
+
257
+ );";
258
+
259
+ add_option($table_name."_version", '1.0');
260
+
261
+ dbDelta($sql);
262
+
263
+
264
+
265
+ // wp_sub1s テーブルを作成
266
+
267
+ $sql = "CREATE TABLE wp_sub1s (
268
+
269
+ `mains_ID` BIGINT(20) UNSIGNED NOT NULL
270
+
271
+ ,`title` VARCHAR(50) NOT NULL
272
+
273
+ ,PRIMARY KEY (`mains_ID`)
274
+
275
+ ,FOREIGN KEY (`mains_ID`) REFERENCES wp_mains(`ID`)
276
+
277
+ );";
278
+
279
+ add_option($table_name."_version", '1.0');
280
+
281
+ dbDelta($sql);
222
282
 
223
283
  }
224
284
 
225
-
226
-
227
- // エラーあればtrue
228
-
229
- function my_is_error_info( $arr ){
230
-
231
- /*
232
-
233
- error_wrapper の中の error_info が空じゃなければ true と判定
234
-
235
-
236
-
237
- たとえばこんな感じ
238
-
239
- $arr = [
240
-
241
- 'error_wrapper'=>[
242
-
243
- 'func' => 'hoo()'
244
-
245
- ,'args' => [ '$args'=>'$args' ]
246
-
247
- ,'error_info' => [ 'ここが空じゃなければ true' ]
248
-
249
- ]
250
-
251
- ];
252
-
253
- var_dump( my_is_error_info($arr) ); // -> bool(true)
254
-
255
- */
256
-
257
-
258
-
259
- $error = false;
260
-
261
-
262
-
263
- if ( array_key_exists('error_wrapper', $arr) ) {
264
-
265
- $error_wrapper = $arr['error_wrapper'];
266
-
267
- foreach( $error_wrapper as $k=>$error_info ){
268
-
269
- if( $k=='error_info' && is_array($error_info) && count($error_info) >= 1 ){
270
-
271
- $error = true;
272
-
273
- }
274
-
275
- }
276
-
277
- }
278
-
279
-
280
-
281
- return $error;
282
-
283
- }
284
-
285
285
  ```
286
286
 
287
- テーブルのCREATEは以下です。
288
-
289
- ```PHP
290
-
291
- test_create_table();
292
-
293
- function test_create_table(){
294
-
295
- global $wpdb;
296
-
297
-
298
-
299
- $table_name = 'mains';
300
-
301
- if ($wpdb->get_var("show tables like '" . $wpdb->prefix . $table_name . "'") != $wpdb->prefix . $table_name) {
302
-
303
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
304
-
305
- $sql = "CREATE TABLE " . $wpdb->prefix . $table_name . "(
306
-
307
- `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
308
-
309
- ,`users_ID` BIGINT(20) UNSIGNED NOT NULL
310
-
311
- ,`content` VARCHAR(1000)
312
-
313
- ,PRIMARY KEY (`ID`)
314
-
315
- ,FOREIGN KEY (`users_ID`) REFERENCES wp_users(`ID`)
316
-
317
- );";
318
-
319
- add_option($table_name."_version", '1.0');
320
-
321
- dbDelta($sql);
322
-
323
- }
324
-
325
-
326
-
327
- $table_name = 'sub1s';
328
-
329
- if ($wpdb->get_var("show tables like '" . $wpdb->prefix . $table_name . "'") != $wpdb->prefix . $table_name) {
330
-
331
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
332
-
333
- $sql = "CREATE TABLE " . $wpdb->prefix . $table_name . "(
334
-
335
- `mains_ID` BIGINT(20) UNSIGNED NOT NULL
336
-
337
- ,`title` VARCHAR(50) NOT NULL
338
-
339
- ,PRIMARY KEY (`mains_ID`)
340
-
341
- ,FOREIGN KEY (`mains_ID`) REFERENCES wp_mains(`ID`)
342
-
343
- );";
344
-
345
- add_option($table_name."_version", '1.0');
346
-
347
- dbDelta($sql);
348
-
349
- }
350
-
351
- }
352
-
353
- ```
354
-
355
287
  ###試したこと
356
288
 
357
- 上記ソースコードにありますが、ROLLBACKすべき条件分岐に差し掛かってることを確認するため`error_log( '$inserted = '. json_encode($inserted, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって絵文字だからエラーというのは検出できているようです。
289
+ 上記ソースコードにありますが、ROLLBACKすべき条件分岐に差し掛かってることを確認するため`error_log( '$result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって`// 絵文字があるため次のエラーに該当する`というのは分岐できているようです。
358
-
359
-
360
-
290
+
291
+
292
+
361
- なのにこの一行前の`$wpdb->query('ROLLBACK'); // ここでROLLBACKが効かず、wp_mainsにだけ値が入ってしまうのが問題です`のROLLBACKが効かないということです。
293
+ なのにこの一行前の`$wpdb->query('ROLLBACK'); // ここで ROLLBACK が効かず、wp_mains にだけ値が入ってしまうのが問題です`のROLLBACKが効かないということです。
362
294
 
363
295
 
364
296
 

1

訂正

2020/05/30 23:37

投稿

yakan
yakan

スコア19

test CHANGED
File without changes
test CHANGED
@@ -354,7 +354,11 @@
354
354
 
355
355
  ###試したこと
356
356
 
357
- 上記ソースコードにありますが、ROLLBACKすべき条件分岐に差し掛かってることを確認するため`error_log( '$inserted = '. json_encode($inserted, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって「絵文字だからエラー」というのは検出できているようです。なのにこの次の行のROLLBACKが効かないということです。
357
+ 上記ソースコードにありますが、ROLLBACKすべき条件分岐に差し掛かってることを確認するため`error_log( '$inserted = '. json_encode($inserted, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって「絵文字だからエラー」というのは検出できているようです。
358
+
359
+
360
+
361
+ なのにこの一行前の`$wpdb->query('ROLLBACK'); // ここでROLLBACKが効かず、wp_mainsにだけ値が入ってしまうのが問題です`のROLLBACKが効かないということです。
358
362
 
359
363
 
360
364