質問編集履歴
6
コードの誤字を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -100,7 +100,7 @@
|
|
100
100
|
|
101
101
|
];
|
102
102
|
|
103
|
-
$result_sub = test_insert_sql_row(
|
103
|
+
$result_sub = test_insert_sql_row( 'wp_sub1s', $update_info );
|
104
104
|
|
105
105
|
// エラー
|
106
106
|
|
5
コードの不要な行を削除
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
コードの誤字を修正
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 テーブル が無事入ったら
|
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
コードを最小限に修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
ソースコードは以下で、`wp_sub1s`の`
|
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(
|
35
|
+
$result = test_insert_table();
|
36
36
|
|
37
37
|
var_dump($result);
|
38
38
|
|
39
39
|
|
40
40
|
|
41
|
-
function test_insert_table(
|
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_
|
57
|
+
$sub_table = 'wp_sub1s';
|
58
|
-
|
58
|
+
|
59
|
-
$
|
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
|
-
$
|
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_
|
233
|
+
function test_create_table(){
|
150
234
|
|
151
235
|
global $wpdb;
|
152
236
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
-
|
291
|
+
次にROLLBACKすべき条件分岐に差し掛かっているかどうかを確認するため、`error_log( '$result = ' . json_encode($result, JSON_UNESCAPED_UNICODE) );`を書いており、これは出力されました。よって`// エラーなら ROLLBACK する`というのは分岐できているようです。
|
290
292
|
|
291
293
|
|
292
294
|
|
2
コードを最小限に修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
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
|
-
|
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
|
-
|
61
|
+
$wpdb->query($sql);
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
62
|
+
|
56
|
-
|
57
|
-
|
63
|
+
|
58
|
-
|
59
|
-
|
64
|
+
|
60
|
-
|
61
|
-
'func' => 'test_insert_table()'
|
62
|
-
|
63
|
-
,'args' => [ '$post_type'=>$post_type ]
|
64
|
-
|
65
|
-
,'error_info' => []
|
66
|
-
|
67
|
-
]
|
68
|
-
|
69
|
-
];
|
70
|
-
|
71
|
-
|
65
|
+
try{
|
72
66
|
|
73
67
|
// wp_mains テーブルを更新
|
74
68
|
|
@@ -80,62 +74,60 @@
|
|
80
74
|
|
81
75
|
];
|
82
76
|
|
83
|
-
$insert_id =
|
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
|
83
|
+
if( !empty($insert_id['errors']) ){
|
86
|
-
|
84
|
+
|
87
|
-
$
|
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
|
-
|
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 $
|
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
|
235
|
+
function test_create_table(){
|
160
236
|
|
161
237
|
global $wpdb;
|
162
238
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
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( '$
|
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
訂正
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) );`を書いており、これは出力されました。よって「絵文字だからエラー」というのは検出できているようです。
|
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
|
|