質問編集履歴
4
補足
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 = "
|
13
|
+
$db_admin = "sbiccicms_admin_local_auto";
|
20
|
-
$db_common = "
|
14
|
+
$db_common = "sbiccicms_common_local_auto";
|
21
|
-
$db_front = "
|
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='. $
|
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 '
|
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($
|
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
|
-
|
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 '
|
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 (
|
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
補足
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
実現したいことを追加
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
補足
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
|
```
|