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

質問編集履歴

4

補足

2020/05/11 03:58

投稿

kaito2414
kaito2414

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,31 +1,24 @@
1
- トランザクション処理が失敗しても通ってしまいます
1
+ トランザクション処理が失敗しても通ってしまいます
2
+ 1つ目は成功、2つ目は失敗にしていますが、2が失敗しても1はそのまま実行されてしまいます。
2
3
  [参考サイト](https://gray-code.com/php/transaction-by-using-pdo/)
3
4
 
4
5
  環境:MYSQL
5
6
 
6
- テーブルを作成するコードなのですが、
7
- $dbh->query($table_cpppp);
8
- という存在しない変数名を宣言し失敗するようにしているのですが、
9
- ロールバック失敗と表示されるものテブル作成されしまいます。
7
+ 2つ目インサト文引数があっていません
10
8
 
11
- トランザクション処理は簡単に言うとトランザクション内がエラーなく成功するとそのコードを実行し、途中でエラーが出たら、処理内容を破棄し、実行しないという処理ですよね?
12
-
13
- 原因を教えていただけないでしょうか。
14
-
15
9
  ```php
16
10
  <?php
17
11
  // DB情報
18
12
  $dbh = null;
19
- $db_admin = "sbiccicms_admin_local2";
13
+ $db_admin = "sbiccicms_admin_local_auto";
20
- $db_common = "sbiccicms_common_local2";
14
+ $db_common = "sbiccicms_common_local_auto";
21
- $db_front = "sbiccicms_front_local2";
15
+ $db_front = "sbiccicms_front_local_auto";
22
16
  $user = 'root';
23
17
  $pass = '';
24
- $table_name = "categories";
25
18
 
26
19
  try {
27
20
  // DB接続
28
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
21
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_admin.'; charset=utf8', $user, $pass);
29
22
 
30
23
  //例外処理を投げる(スロー)ようにする
31
24
  $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
@@ -33,71 +26,32 @@
33
26
  // トランザクション開始
34
27
  $dbh->beginTransaction();
35
28
 
36
- // サブテーブル作成
37
- $table_cp = 'create table test_import like '.$table_name;
29
+ $table_cp = 'create table test_import like site_configs';
38
30
  $table_create = $dbh->query($table_cp);
39
31
 
40
-      // 失敗
32
+ $table_cp = 'create table error like site_configs';
41
- $dbh->query($table_cpppp);
33
+ $table_create = $dbh->query($table_cp);
42
34
 
35
+ $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))";
43
- echo "コミット";
36
+ $insert_users_check = $dbh->query($insert_site_configs);
44
37
 
38
+ $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))";
39
+ $insert_users_check = $dbh->query($insert_site_configs);
40
+
45
41
  // コミット
46
42
  $dbh->commit();
47
43
 
48
44
  } catch (PDOException $e) {
49
- echo "ロールバック";
50
45
  // ロールバック
51
46
  $dbh->rollBack();
52
- echo '失敗:' . $e->getMessage();
47
+ echo 'DB接続エラー:' . $e->getMessage();
53
- }
54
-
55
-
56
- // DB接続終了
57
- $dbh = null;
58
-
59
- ?>
48
+ die();
60
- ```
61
-
62
- ```php
63
- <?php
64
- // DB情報
65
- $dbh = null;
66
- $db_admin = "sbiccicms_admin_local2";
67
- $db_common = "sbiccicms_common_local2";
68
- $db_front = "sbiccicms_front_local2";
69
- $user = 'root';
70
- $pass = '';
71
- $table_name = "categories";
72
-
73
- try {
74
- // DB接続
75
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
76
- // トランザクション開始
77
- $dbh->beginTransaction();
78
-
79
- // 存在しないテーブルにUPDATE
80
- $sql = "UPDATE categories SET age = 25 WHERE id = 4";
81
-
82
- // クエリ実行
83
- $res = $dbh->query($sql);
84
-
85
- // サブテーブル作成
86
- $table_cp = 'create table test_import like '.$table_name;
87
- $table_create = $dbh->query($table_cp);
88
- if (!$table_create) {
89
- throw new Exception('テーブル作成失敗');
90
- }
91
-
92
-
93
- // 強制的にロールバックする
94
- $dbh->rollBack();
95
-
96
- } catch (PDOException $e) {
49
+ } catch (Throwable $e) {
97
50
  echo "ロールバック";
98
51
  // ロールバック
99
52
  $dbh->rollBack();
100
53
  echo '失敗:' . $e->getMessage();
54
+ die();
101
55
  }
102
56
 
103
57
 
@@ -105,126 +59,4 @@
105
59
  $dbh = null;
106
60
 
107
61
  ?>
108
- ```
109
-
110
- ### **※実現したいこと**
111
-
112
- 以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
113
- insertをロールバック
114
-
115
-
116
- ```php
117
- <?php
118
- // DB情報
119
- $dbh = null;
120
- $db_admin = "sbiccicms_admin_local2";
121
- $db_common = "sbiccicms_common_local2";
122
- $db_front = "sbiccicms_front_local2";
123
- $user = 'root';
124
- $pass = '';
125
-
126
- // URlファイルパス取得
127
- $get_dir = __FILE__;
128
- $get_dir_path = dirname($get_dir);
129
- $csv_path = glob($get_dir_path.'/categoris/categori.csv');
130
- $csv_color = glob($get_dir_path.'/categoris/category_colors.csv');
131
-
132
- $table_name = "categories";
133
-
134
- try {
135
- // DB接続
136
- $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
137
-
138
- // トランザクション処理
139
-
140
- // サブテーブル作成
141
- $table_cp = 'create table test_import like '.$table_name;
142
- $table_create = $dbh->query($table_cp);
143
- if (!$table_create) {
144
- $delet_table = "DROP TABLE test_import";
145
- $dbh->query($delet_table);
146
- throw new Exception('テーブル作成失敗');
147
- }
148
-
149
- // color読み込み
150
- if (($handle_color = fopen($csv_color[0], "r")) !== FALSE) {
151
- // ファイルポインタ有効時
152
- $color = [];
153
- while ($handle_color && !feof($handle_color)) {
154
- $input_color = fgetcsv($handle_color);
155
- if (!$input_color) {
156
- continue;
157
- }
158
-
159
- // エンコード
160
- if ($input_color[1]==="") {
161
- continue;
162
- }
163
- $input_color[1] = mb_convert_encoding($input_color[1], 'UTF-8', 'SJIS-win');
164
- $color[] = $input_color[1];
165
- }
166
- }
167
- fclose($handle_color);
168
-
169
- // CSVファイルインサート準備
170
- $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))";
171
- $insert_start = $dbh->prepare($insert);
172
- if (!$insert_start) {
173
- $delet_table = "DROP TABLE test_import";
174
- $dbh->query($delet_table);
175
- throw new Exception('インサート準備失敗');
176
- }
177
-
178
-
179
- // CSVファイルインサート
180
- if (($handle = fopen($csv_path[0], "r")) !== FALSE) {
181
- // ファイルポインタ有効時
182
- $title_skip = 0;
183
- $co = 1;
184
- while ($handle && !feof($handle)) {
185
- $input_csv = fgetcsv($handle);
186
- if ($title_skip < 2) {
187
- $title_skip++;
188
- continue;
189
- }
190
- if (!$input_csv) {
191
- continue;
192
- }
193
-
194
- // エンコード
195
- $count_input_csv = count($input_csv);
196
- for ($i=1;$i<$count_input_csv;$i++) {
197
- if ($input_csv[$i]==="") {
198
- continue;
199
- }
200
- $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win');
201
- }
202
-
203
- // 実行
204
- $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]]);
205
- if (!$synonyms_check) {
206
- $delet_table = "DROP TABLE test_import";
207
- $dbh->query($delet_table);
208
- throw new Exception('インサート失敗');
209
- }
210
- $co++;
211
- }
212
- }
213
-
214
- // 上書き
215
- $delet_table = "DROP TABLE $table_name";
216
- $dbh->query($delet_table);
217
- $rename = "ALTER TABLE test_import RENAME $table_name";
218
- $dbh->query($rename);
219
-
220
- // 接続終了
221
- fclose($handle);
222
- $insert_start = null;
223
- $dbh = null;
224
-
225
- } catch (PDOException $e) {
226
- echo 'DB接続エラー:' . $e->getMessage();
227
- }
228
-
229
- ?>
230
62
  ```

3

補足

2020/05/11 03:58

投稿

kaito2414
kaito2414

スコア11

title CHANGED
File without changes
body CHANGED
@@ -110,6 +110,7 @@
110
110
  ### **※実現したいこと**
111
111
 
112
112
  以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
113
+ insertをロールバック
113
114
 
114
115
 
115
116
  ```php

2

実現したいことを追加

2020/05/11 02:56

投稿

kaito2414
kaito2414

スコア11

title CHANGED
File without changes
body CHANGED
@@ -105,4 +105,125 @@
105
105
  $dbh = null;
106
106
 
107
107
  ?>
108
+ ```
109
+
110
+ ### **※実現したいこと**
111
+
112
+ 以下のコードにトランザクション処理を導入し、サブテーブル作成工程をなくす。
113
+
114
+
115
+ ```php
116
+ <?php
117
+ // DB情報
118
+ $dbh = null;
119
+ $db_admin = "sbiccicms_admin_local2";
120
+ $db_common = "sbiccicms_common_local2";
121
+ $db_front = "sbiccicms_front_local2";
122
+ $user = 'root';
123
+ $pass = '';
124
+
125
+ // URlファイルパス取得
126
+ $get_dir = __FILE__;
127
+ $get_dir_path = dirname($get_dir);
128
+ $csv_path = glob($get_dir_path.'/categoris/categori.csv');
129
+ $csv_color = glob($get_dir_path.'/categoris/category_colors.csv');
130
+
131
+ $table_name = "categories";
132
+
133
+ try {
134
+ // DB接続
135
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
136
+
137
+ // トランザクション処理
138
+
139
+ // サブテーブル作成
140
+ $table_cp = 'create table test_import like '.$table_name;
141
+ $table_create = $dbh->query($table_cp);
142
+ if (!$table_create) {
143
+ $delet_table = "DROP TABLE test_import";
144
+ $dbh->query($delet_table);
145
+ throw new Exception('テーブル作成失敗');
146
+ }
147
+
148
+ // color読み込み
149
+ if (($handle_color = fopen($csv_color[0], "r")) !== FALSE) {
150
+ // ファイルポインタ有効時
151
+ $color = [];
152
+ while ($handle_color && !feof($handle_color)) {
153
+ $input_color = fgetcsv($handle_color);
154
+ if (!$input_color) {
155
+ continue;
156
+ }
157
+
158
+ // エンコード
159
+ if ($input_color[1]==="") {
160
+ continue;
161
+ }
162
+ $input_color[1] = mb_convert_encoding($input_color[1], 'UTF-8', 'SJIS-win');
163
+ $color[] = $input_color[1];
164
+ }
165
+ }
166
+ fclose($handle_color);
167
+
168
+ // CSVファイルインサート準備
169
+ $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))";
170
+ $insert_start = $dbh->prepare($insert);
171
+ if (!$insert_start) {
172
+ $delet_table = "DROP TABLE test_import";
173
+ $dbh->query($delet_table);
174
+ throw new Exception('インサート準備失敗');
175
+ }
176
+
177
+
178
+ // CSVファイルインサート
179
+ if (($handle = fopen($csv_path[0], "r")) !== FALSE) {
180
+ // ファイルポインタ有効時
181
+ $title_skip = 0;
182
+ $co = 1;
183
+ while ($handle && !feof($handle)) {
184
+ $input_csv = fgetcsv($handle);
185
+ if ($title_skip < 2) {
186
+ $title_skip++;
187
+ continue;
188
+ }
189
+ if (!$input_csv) {
190
+ continue;
191
+ }
192
+
193
+ // エンコード
194
+ $count_input_csv = count($input_csv);
195
+ for ($i=1;$i<$count_input_csv;$i++) {
196
+ if ($input_csv[$i]==="") {
197
+ continue;
198
+ }
199
+ $input_csv[$i] = mb_convert_encoding($input_csv[$i], 'UTF-8', 'SJIS-win');
200
+ }
201
+
202
+ // 実行
203
+ $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]]);
204
+ if (!$synonyms_check) {
205
+ $delet_table = "DROP TABLE test_import";
206
+ $dbh->query($delet_table);
207
+ throw new Exception('インサート失敗');
208
+ }
209
+ $co++;
210
+ }
211
+ }
212
+
213
+ // 上書き
214
+ $delet_table = "DROP TABLE $table_name";
215
+ $dbh->query($delet_table);
216
+ $rename = "ALTER TABLE test_import RENAME $table_name";
217
+ $dbh->query($rename);
218
+
219
+ // 接続終了
220
+ fclose($handle);
221
+ $insert_start = null;
222
+ $dbh = null;
223
+
224
+ } catch (PDOException $e) {
225
+ echo 'DB接続エラー:' . $e->getMessage();
226
+ }
227
+
228
+ ?>
108
229
  ```

1

補足

2020/05/11 02:27

投稿

kaito2414
kaito2414

スコア11

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,8 @@
1
1
  トランザクション処理が失敗しても通ってしまいます
2
2
  [参考サイト](https://gray-code.com/php/transaction-by-using-pdo/)
3
3
 
4
+ 環境:MYSQL
5
+
4
6
  テーブルを作成するコードなのですが、
5
7
  $dbh->query($table_cpppp);
6
8
  という存在しない変数名を宣言し失敗するようにしているのですが、
@@ -55,4 +57,52 @@
55
57
  $dbh = null;
56
58
 
57
59
  ?>
60
+ ```
61
+
62
+ ```php
63
+ <?php
64
+ // DB情報
65
+ $dbh = null;
66
+ $db_admin = "sbiccicms_admin_local2";
67
+ $db_common = "sbiccicms_common_local2";
68
+ $db_front = "sbiccicms_front_local2";
69
+ $user = 'root';
70
+ $pass = '';
71
+ $table_name = "categories";
72
+
73
+ try {
74
+ // DB接続
75
+ $dbh = new PDO('mysql:host=127.0.0.1; dbname='. $db_front.'; charset=utf8', $user, $pass);
76
+ // トランザクション開始
77
+ $dbh->beginTransaction();
78
+
79
+ // 存在しないテーブルにUPDATE
80
+ $sql = "UPDATE categories SET age = 25 WHERE id = 4";
81
+
82
+ // クエリ実行
83
+ $res = $dbh->query($sql);
84
+
85
+ // サブテーブル作成
86
+ $table_cp = 'create table test_import like '.$table_name;
87
+ $table_create = $dbh->query($table_cp);
88
+ if (!$table_create) {
89
+ throw new Exception('テーブル作成失敗');
90
+ }
91
+
92
+
93
+ // 強制的にロールバックする
94
+ $dbh->rollBack();
95
+
96
+ } catch (PDOException $e) {
97
+ echo "ロールバック";
98
+ // ロールバック
99
+ $dbh->rollBack();
100
+ echo '失敗:' . $e->getMessage();
101
+ }
102
+
103
+
104
+ // DB接続終了
105
+ $dbh = null;
106
+
107
+ ?>
58
108
  ```