質問編集履歴

4

補足

2020/05/11 03:58

投稿

kaito2414
kaito2414

スコア11

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,6 @@
1
- トランザクション処理が失敗しても通ってしまいます
1
+ トランザクション処理が失敗しても通ってしまいます
2
+
3
+ 1つ目は成功、2つ目は失敗にしていますが、2が失敗しても1はそのまま実行されてしまいます。
2
4
 
3
5
  [参考サイト](https://gray-code.com/php/transaction-by-using-pdo/)
4
6
 
@@ -8,21 +10,7 @@
8
10
 
9
11
 
10
12
 
11
- テーブルを作成するコードなのですが、
12
-
13
- $dbh->query($table_cpppp);
14
-
15
- という存在しない変数名を宣言し失敗するようにしているのですが、
16
-
17
- ロールバック失敗と表示されるものテブル作成されしまいます。
13
+ 2つ目インサト文引数があっていません
18
-
19
-
20
-
21
- トランザクション処理は簡単に言うとトランザクション内がエラーなく成功するとそのコードを実行し、途中でエラーが出たら、処理内容を破棄し、実行しないという処理ですよね?
22
-
23
-
24
-
25
- 原因を教えていただけないでしょうか。
26
14
 
27
15
 
28
16
 
@@ -34,17 +22,15 @@
34
22
 
35
23
  $dbh = null;
36
24
 
37
- $db_admin = "sbiccicms_admin_local2";
25
+ $db_admin = "sbiccicms_admin_local_auto";
38
26
 
39
- $db_common = "sbiccicms_common_local2";
27
+ $db_common = "sbiccicms_common_local_auto";
40
28
 
41
- $db_front = "sbiccicms_front_local2";
29
+ $db_front = "sbiccicms_front_local_auto";
42
30
 
43
31
  $user = 'root';
44
32
 
45
33
  $pass = '';
46
-
47
- $table_name = "categories";
48
34
 
49
35
 
50
36
 
@@ -52,7 +38,7 @@
52
38
 
53
39
  // DB接続
54
40
 
55
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
41
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_admin.'; charset=utf8', $user, $pass);
56
42
 
57
43
 
58
44
 
@@ -68,21 +54,27 @@
68
54
 
69
55
 
70
56
 
71
- // サブテーブル作成
72
-
73
- $table_cp = 'create table test_import like '.$table_name;
57
+ $table_cp = 'create table test_import like site_configs';
74
58
 
75
59
  $table_create = $dbh->query($table_cp);
76
60
 
77
61
 
78
62
 
79
-      // 失敗
63
+ $table_cp = 'create table error like site_configs';
80
64
 
81
- $dbh->query($table_cpppp);
65
+ $table_create = $dbh->query($table_cp);
82
66
 
83
67
 
84
68
 
69
+ $insert_site_configs = "INSERT INTO test_import (site_url, site_name, wrt_user_id, created, modified) VALUES ('CCI', 'CCIホーム', 99, cast(now() as datetime),cast(now() as datetime))";
70
+
85
- echo "コミット";
71
+ $insert_users_check = $dbh->query($insert_site_configs);
72
+
73
+
74
+
75
+ $insert_site_configs = "INSERT INTO error (site_url, site_name, wrt_user_id, created, modified) VALUES ('CCIホーム', 99, cast(now() as datetime),cast(now() as datetime))";
76
+
77
+ $insert_users_check = $dbh->query($insert_site_configs);
86
78
 
87
79
 
88
80
 
@@ -94,6 +86,16 @@
94
86
 
95
87
  } catch (PDOException $e) {
96
88
 
89
+ // ロールバック
90
+
91
+ $dbh->rollBack();
92
+
93
+ echo 'DB接続エラー:' . $e->getMessage();
94
+
95
+ die();
96
+
97
+ } catch (Throwable $e) {
98
+
97
99
  echo "ロールバック";
98
100
 
99
101
  // ロールバック
@@ -101,6 +103,8 @@
101
103
  $dbh->rollBack();
102
104
 
103
105
  echo '失敗:' . $e->getMessage();
106
+
107
+ die();
104
108
 
105
109
  }
106
110
 
@@ -117,343 +121,3 @@
117
121
  ?>
118
122
 
119
123
  ```
120
-
121
-
122
-
123
- ```php
124
-
125
- <?php
126
-
127
- // DB情報
128
-
129
- $dbh = null;
130
-
131
- $db_admin = "sbiccicms_admin_local2";
132
-
133
- $db_common = "sbiccicms_common_local2";
134
-
135
- $db_front = "sbiccicms_front_local2";
136
-
137
- $user = 'root';
138
-
139
- $pass = '';
140
-
141
- $table_name = "categories";
142
-
143
-
144
-
145
- try {
146
-
147
- // DB接続
148
-
149
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
150
-
151
- // トランザクション開始
152
-
153
- $dbh->beginTransaction();
154
-
155
-
156
-
157
- // 存在しないテーブルにUPDATE
158
-
159
- $sql = "UPDATE categories SET age = 25 WHERE id = 4";
160
-
161
-
162
-
163
- // クエリ実行
164
-
165
- $res = $dbh->query($sql);
166
-
167
-
168
-
169
- // サブテーブル作成
170
-
171
- $table_cp = 'create table test_import like '.$table_name;
172
-
173
- $table_create = $dbh->query($table_cp);
174
-
175
- if (!$table_create) {
176
-
177
- throw new Exception('テーブル作成失敗');
178
-
179
- }
180
-
181
-
182
-
183
-
184
-
185
- // 強制的にロールバックする
186
-
187
- $dbh->rollBack();
188
-
189
-
190
-
191
- } catch (PDOException $e) {
192
-
193
- echo "ロールバック";
194
-
195
- // ロールバック
196
-
197
- $dbh->rollBack();
198
-
199
- echo '失敗:' . $e->getMessage();
200
-
201
- }
202
-
203
-
204
-
205
-
206
-
207
- // DB接続終了
208
-
209
- $dbh = null;
210
-
211
-
212
-
213
- ?>
214
-
215
- ```
216
-
217
-
218
-
219
- ### **※実現したいこと**
220
-
221
-
222
-
223
- 以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
224
-
225
- insertをロールバック
226
-
227
-
228
-
229
-
230
-
231
- ```php
232
-
233
- <?php
234
-
235
- // DB情報
236
-
237
- $dbh = null;
238
-
239
- $db_admin = "sbiccicms_admin_local2";
240
-
241
- $db_common = "sbiccicms_common_local2";
242
-
243
- $db_front = "sbiccicms_front_local2";
244
-
245
- $user = 'root';
246
-
247
- $pass = '';
248
-
249
-
250
-
251
- // URlファイルパス取得
252
-
253
- $get_dir = __FILE__;
254
-
255
- $get_dir_path = dirname($get_dir);
256
-
257
- $csv_path = glob($get_dir_path.'/categoris/categori.csv');
258
-
259
- $csv_color = glob($get_dir_path.'/categoris/category_colors.csv');
260
-
261
-
262
-
263
- $table_name = "categories";
264
-
265
-
266
-
267
- try {
268
-
269
- // DB接続
270
-
271
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
272
-
273
-
274
-
275
- // トランザクション処理
276
-
277
-
278
-
279
- // サブテーブル作成
280
-
281
- $table_cp = 'create table test_import like '.$table_name;
282
-
283
- $table_create = $dbh->query($table_cp);
284
-
285
- if (!$table_create) {
286
-
287
- $delet_table = "DROP TABLE test_import";
288
-
289
- $dbh->query($delet_table);
290
-
291
- throw new Exception('テーブル作成失敗');
292
-
293
- }
294
-
295
-
296
-
297
- // color読み込み
298
-
299
- if (($handle_color = fopen($csv_color[0], "r")) !== FALSE) {
300
-
301
- // ファイルポインタ有効時
302
-
303
- $color = [];
304
-
305
- while ($handle_color && !feof($handle_color)) {
306
-
307
- $input_color = fgetcsv($handle_color);
308
-
309
- if (!$input_color) {
310
-
311
- continue;
312
-
313
- }
314
-
315
-
316
-
317
- // エンコード
318
-
319
- if ($input_color[1]==="") {
320
-
321
- continue;
322
-
323
- }
324
-
325
- $input_color[1] = mb_convert_encoding($input_color[1], 'UTF-8', 'SJIS-win');
326
-
327
- $color[] = $input_color[1];
328
-
329
- }
330
-
331
- }
332
-
333
- fclose($handle_color);
334
-
335
-
336
-
337
- // CSVファイルインサート準備
338
-
339
- $insert = "INSERT INTO test_import (site_id, parent_id, name, pass, sort, level, color, user_id, created) VALUES (:site_id, :parent_id, :name, :pass, :sort, :level, :color, :user_id, cast(now() as datetime))";
340
-
341
- $insert_start = $dbh->prepare($insert);
342
-
343
- if (!$insert_start) {
344
-
345
- $delet_table = "DROP TABLE test_import";
346
-
347
- $dbh->query($delet_table);
348
-
349
- throw new Exception('インサート準備失敗');
350
-
351
- }
352
-
353
-
354
-
355
-
356
-
357
- // CSVファイルインサート
358
-
359
- if (($handle = fopen($csv_path[0], "r")) !== FALSE) {
360
-
361
- // ファイルポインタ有効時
362
-
363
- $title_skip = 0;
364
-
365
- $co = 1;
366
-
367
- while ($handle && !feof($handle)) {
368
-
369
- $input_csv = fgetcsv($handle);
370
-
371
- if ($title_skip < 2) {
372
-
373
- $title_skip++;
374
-
375
- continue;
376
-
377
- }
378
-
379
- if (!$input_csv) {
380
-
381
- continue;
382
-
383
- }
384
-
385
-
386
-
387
- // エンコード
388
-
389
- $count_input_csv = count($input_csv);
390
-
391
- for ($i=1;$i<$count_input_csv;$i++) {
392
-
393
- if ($input_csv[$i]==="") {
394
-
395
- continue;
396
-
397
- }
398
-
399
- $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win');
400
-
401
- }
402
-
403
-
404
-
405
- // 実行
406
-
407
- $synonyms_check = $insert_start->execute([':site_id' => $input_csv[1], ':parent_id' => $co, ':name' => $input_csv[3], ':pass' => $input_csv[4], ':sort' => $input_csv[5], ':level' => $input_csv[6], ':color' => $color[$co], ':user_id' => $input_csv[8]]);
408
-
409
- if (!$synonyms_check) {
410
-
411
- $delet_table = "DROP TABLE test_import";
412
-
413
- $dbh->query($delet_table);
414
-
415
- throw new Exception('インサート失敗');
416
-
417
- }
418
-
419
- $co++;
420
-
421
- }
422
-
423
- }
424
-
425
-
426
-
427
- // 上書き
428
-
429
- $delet_table = "DROP TABLE $table_name";
430
-
431
- $dbh->query($delet_table);
432
-
433
- $rename = "ALTER TABLE test_import RENAME $table_name";
434
-
435
- $dbh->query($rename);
436
-
437
-
438
-
439
- // 接続終了
440
-
441
- fclose($handle);
442
-
443
- $insert_start = null;
444
-
445
- $dbh = null;
446
-
447
-
448
-
449
- } catch (PDOException $e) {
450
-
451
- echo 'DB接続エラー:' . $e->getMessage();
452
-
453
- }
454
-
455
-
456
-
457
- ?>
458
-
459
- ```

3

補足

2020/05/11 03:58

投稿

kaito2414
kaito2414

スコア11

test CHANGED
File without changes
test CHANGED
@@ -222,6 +222,8 @@
222
222
 
223
223
  以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
224
224
 
225
+ insertをロールバック
226
+
225
227
 
226
228
 
227
229
 

2

実現したいことを追加

2020/05/11 02:56

投稿

kaito2414
kaito2414

スコア11

test CHANGED
File without changes
test CHANGED
@@ -213,3 +213,245 @@
213
213
  ?>
214
214
 
215
215
  ```
216
+
217
+
218
+
219
+ ### **※実現したいこと**
220
+
221
+
222
+
223
+ 以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
224
+
225
+
226
+
227
+
228
+
229
+ ```php
230
+
231
+ <?php
232
+
233
+ // DB情報
234
+
235
+ $dbh = null;
236
+
237
+ $db_admin = "sbiccicms_admin_local2";
238
+
239
+ $db_common = "sbiccicms_common_local2";
240
+
241
+ $db_front = "sbiccicms_front_local2";
242
+
243
+ $user = 'root';
244
+
245
+ $pass = '';
246
+
247
+
248
+
249
+ // URlファイルパス取得
250
+
251
+ $get_dir = __FILE__;
252
+
253
+ $get_dir_path = dirname($get_dir);
254
+
255
+ $csv_path = glob($get_dir_path.'/categoris/categori.csv');
256
+
257
+ $csv_color = glob($get_dir_path.'/categoris/category_colors.csv');
258
+
259
+
260
+
261
+ $table_name = "categories";
262
+
263
+
264
+
265
+ try {
266
+
267
+ // DB接続
268
+
269
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
270
+
271
+
272
+
273
+ // トランザクション処理
274
+
275
+
276
+
277
+ // サブテーブル作成
278
+
279
+ $table_cp = 'create table test_import like '.$table_name;
280
+
281
+ $table_create = $dbh->query($table_cp);
282
+
283
+ if (!$table_create) {
284
+
285
+ $delet_table = "DROP TABLE test_import";
286
+
287
+ $dbh->query($delet_table);
288
+
289
+ throw new Exception('テーブル作成失敗');
290
+
291
+ }
292
+
293
+
294
+
295
+ // color読み込み
296
+
297
+ if (($handle_color = fopen($csv_color[0], "r")) !== FALSE) {
298
+
299
+ // ファイルポインタ有効時
300
+
301
+ $color = [];
302
+
303
+ while ($handle_color && !feof($handle_color)) {
304
+
305
+ $input_color = fgetcsv($handle_color);
306
+
307
+ if (!$input_color) {
308
+
309
+ continue;
310
+
311
+ }
312
+
313
+
314
+
315
+ // エンコード
316
+
317
+ if ($input_color[1]==="") {
318
+
319
+ continue;
320
+
321
+ }
322
+
323
+ $input_color[1] = mb_convert_encoding($input_color[1], 'UTF-8', 'SJIS-win');
324
+
325
+ $color[] = $input_color[1];
326
+
327
+ }
328
+
329
+ }
330
+
331
+ fclose($handle_color);
332
+
333
+
334
+
335
+ // CSVファイルインサート準備
336
+
337
+ $insert = "INSERT INTO test_import (site_id, parent_id, name, pass, sort, level, color, user_id, created) VALUES (:site_id, :parent_id, :name, :pass, :sort, :level, :color, :user_id, cast(now() as datetime))";
338
+
339
+ $insert_start = $dbh->prepare($insert);
340
+
341
+ if (!$insert_start) {
342
+
343
+ $delet_table = "DROP TABLE test_import";
344
+
345
+ $dbh->query($delet_table);
346
+
347
+ throw new Exception('インサート準備失敗');
348
+
349
+ }
350
+
351
+
352
+
353
+
354
+
355
+ // CSVファイルインサート
356
+
357
+ if (($handle = fopen($csv_path[0], "r")) !== FALSE) {
358
+
359
+ // ファイルポインタ有効時
360
+
361
+ $title_skip = 0;
362
+
363
+ $co = 1;
364
+
365
+ while ($handle && !feof($handle)) {
366
+
367
+ $input_csv = fgetcsv($handle);
368
+
369
+ if ($title_skip < 2) {
370
+
371
+ $title_skip++;
372
+
373
+ continue;
374
+
375
+ }
376
+
377
+ if (!$input_csv) {
378
+
379
+ continue;
380
+
381
+ }
382
+
383
+
384
+
385
+ // エンコード
386
+
387
+ $count_input_csv = count($input_csv);
388
+
389
+ for ($i=1;$i<$count_input_csv;$i++) {
390
+
391
+ if ($input_csv[$i]==="") {
392
+
393
+ continue;
394
+
395
+ }
396
+
397
+ $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win');
398
+
399
+ }
400
+
401
+
402
+
403
+ // 実行
404
+
405
+ $synonyms_check = $insert_start->execute([':site_id' => $input_csv[1], ':parent_id' => $co, ':name' => $input_csv[3], ':pass' => $input_csv[4], ':sort' => $input_csv[5], ':level' => $input_csv[6], ':color' => $color[$co], ':user_id' => $input_csv[8]]);
406
+
407
+ if (!$synonyms_check) {
408
+
409
+ $delet_table = "DROP TABLE test_import";
410
+
411
+ $dbh->query($delet_table);
412
+
413
+ throw new Exception('インサート失敗');
414
+
415
+ }
416
+
417
+ $co++;
418
+
419
+ }
420
+
421
+ }
422
+
423
+
424
+
425
+ // 上書き
426
+
427
+ $delet_table = "DROP TABLE $table_name";
428
+
429
+ $dbh->query($delet_table);
430
+
431
+ $rename = "ALTER TABLE test_import RENAME $table_name";
432
+
433
+ $dbh->query($rename);
434
+
435
+
436
+
437
+ // 接続終了
438
+
439
+ fclose($handle);
440
+
441
+ $insert_start = null;
442
+
443
+ $dbh = null;
444
+
445
+
446
+
447
+ } catch (PDOException $e) {
448
+
449
+ echo 'DB接続エラー:' . $e->getMessage();
450
+
451
+ }
452
+
453
+
454
+
455
+ ?>
456
+
457
+ ```

1

補足

2020/05/11 02:27

投稿

kaito2414
kaito2414

スコア11

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
 
6
6
 
7
+ 環境:MYSQL
8
+
9
+
10
+
7
11
  テーブルを作成するコードなのですが、
8
12
 
9
13
  $dbh->query($table_cpppp);
@@ -113,3 +117,99 @@
113
117
  ?>
114
118
 
115
119
  ```
120
+
121
+
122
+
123
+ ```php
124
+
125
+ <?php
126
+
127
+ // DB情報
128
+
129
+ $dbh = null;
130
+
131
+ $db_admin = "sbiccicms_admin_local2";
132
+
133
+ $db_common = "sbiccicms_common_local2";
134
+
135
+ $db_front = "sbiccicms_front_local2";
136
+
137
+ $user = 'root';
138
+
139
+ $pass = '';
140
+
141
+ $table_name = "categories";
142
+
143
+
144
+
145
+ try {
146
+
147
+ // DB接続
148
+
149
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
150
+
151
+ // トランザクション開始
152
+
153
+ $dbh->beginTransaction();
154
+
155
+
156
+
157
+ // 存在しないテーブルにUPDATE
158
+
159
+ $sql = "UPDATE categories SET age = 25 WHERE id = 4";
160
+
161
+
162
+
163
+ // クエリ実行
164
+
165
+ $res = $dbh->query($sql);
166
+
167
+
168
+
169
+ // サブテーブル作成
170
+
171
+ $table_cp = 'create table test_import like '.$table_name;
172
+
173
+ $table_create = $dbh->query($table_cp);
174
+
175
+ if (!$table_create) {
176
+
177
+ throw new Exception('テーブル作成失敗');
178
+
179
+ }
180
+
181
+
182
+
183
+
184
+
185
+ // 強制的にロールバックする
186
+
187
+ $dbh->rollBack();
188
+
189
+
190
+
191
+ } catch (PDOException $e) {
192
+
193
+ echo "ロールバック";
194
+
195
+ // ロールバック
196
+
197
+ $dbh->rollBack();
198
+
199
+ echo '失敗:' . $e->getMessage();
200
+
201
+ }
202
+
203
+
204
+
205
+
206
+
207
+ // DB接続終了
208
+
209
+ $dbh = null;
210
+
211
+
212
+
213
+ ?>
214
+
215
+ ```