質問編集履歴

1

form_insert.phpを全文表示

2019/07/22 13:32

投稿

hello_mate
hello_mate

スコア21

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,13 @@
72
72
 
73
73
  require_once('common_function.php');
74
74
 
75
-
75
+ date_default_timezone_set('Asia/Tokyo');
76
+
77
+ $user_input_data = array();
78
+
79
+
80
+
81
+ // 「パラメタの一覧」を把握
76
82
 
77
83
  $params = array('name', 'post', 'address', 'birthday_yy', 'birthday_mm', 'birthday_dd');
78
84
 
@@ -86,53 +92,155 @@
86
92
 
87
93
 
88
94
 
95
+ $error_flg = false;
96
+
97
+ $error_detail = array(); // エラー情報の詳細を入れるための配列を用意する
98
+
99
+ // 必須チェックを実装
100
+
101
+ $validate_params = array('name', 'post', 'address', 'birthday_yy', 'birthday_mm', 'birthday_dd');
102
+
103
+ foreach($validate_params as $p) {
104
+
105
+ // 空文字(未入力)なら
106
+
107
+ if ('' === $user_input_data[$p]) {
108
+
109
+ // 「必須情報の未入力エラー」であることを配列に格納しておく
110
+
111
+ $error_detail["error_must_{$p}"] = true; // 例えば「名前が未入力」の場合は、key名は「error_must_name」となる
112
+
113
+ // エラーフラグを立てる
114
+
115
+ $error_flg = true;
116
+
117
+ }
118
+
119
+ }
120
+
121
+
122
+
123
+ if (1 !== preg_match('/\A[0-9]{3}[- ]?[0-9]{4}\z/', $user_input_data['post'])) {
124
+
125
+ // 「郵便番号のフォーマットエラー」であることを配列に格納しておく
126
+
127
+ $error_detail["error_format_post"] = true;
128
+
129
+ // エラーフラグを立てる
130
+
131
+ $error_flg = true;
132
+
133
+ }
134
+
135
+
136
+
137
+ $int_params = array('birthday_yy', 'birthday_mm', 'birthday_dd');
138
+
139
+ foreach($int_params as $p) {
140
+
141
+ $user_input_data[$p] = intval($user_input_data[$p]);
142
+
143
+ }
144
+
145
+
146
+
147
+ if (false === checkdate($user_input_data['birthday_mm'], $user_input_data['birthday_dd'], $user_input_data['birthday_yy'])) {
148
+
149
+ $error_detail["error_format_birthday"] = true;
150
+
151
+ // エラーフラグを立てる
152
+
153
+ $error_flg = true;
154
+
155
+ }
156
+
157
+
158
+
159
+ // CSRFチェック
160
+
161
+ if (false === is_csrf_token()) {
162
+
163
+ $error_detail["error_csrf"] = true;
164
+
165
+ $error_flg = true;
166
+
167
+ }
168
+
169
+ // エラーが出たら入力ページに遷移する
170
+
171
+ if (true === $error_flg) {
172
+
173
+ // エラー情報をセッションに入れて持ちまわる
174
+
175
+ $_SESSION['output_buffer'] = $error_detail;
176
+
177
+ // 入力値をセッションに入れて持ちまわる
178
+
179
+ // XXX 「keyが重複しない」はずなので、加算演算子でOK
180
+
181
+ $_SESSION['output_buffer'] += $user_input_data;
182
+
183
+ // 入力ページに遷移する
184
+
185
+ header('Location: ./form_insert.php');
186
+
187
+ exit;
188
+
189
+ }
190
+
89
191
  // DBハンドルの取得
90
192
 
193
+ try{
194
+
91
- $dbh = get_dbh();
195
+ $dbh = get_dbh();
92
-
93
- // INSERT文の作成と発行
196
+
94
-
95
- // ------------------------------
96
-
97
- // 準備された文(プリペアドステートメント)の用意
98
-
99
- $sql = 'INSERT INTO test_form(name, post, address, birthday, created, updated)
197
+ $sql = 'INSERT INTO test_form(name, post, address, birthday, created, updated)
100
-
198
+
101
- VALUES (:name, :post, :address, :birthday, :created, :updated);';
199
+ VALUES (:name, :post, :address, :birthday, :created, :updated);';
102
-
103
- var_dump($sql);
200
+
104
-
201
+
202
+
105
- $pre = $dbh->prepare($sql);
203
+ $pre = $dbh->prepare($sql);
106
-
204
+
107
- // 値のバインド
205
+ // 値のバインド
108
-
206
+
109
- $pre->bindValue(':name', $user_input_data['name'], PDO::PARAM_STR);
207
+ $pre->bindValue(':name', $user_input_data['name'], PDO::PARAM_STR);
110
-
208
+
111
- $pre->bindValue(':post', $user_input_data['post'], PDO::PARAM_STR);
209
+ $pre->bindValue(':post', $user_input_data['post'], PDO::PARAM_STR);
112
-
210
+
113
- $pre->bindValue(':address', $user_input_data['address'], PDO::PARAM_STR);
211
+ $pre->bindValue(':address', $user_input_data['address'], PDO::PARAM_STR);
114
-
212
+
115
- //
213
+ //
116
-
214
+
117
- $birthday = "{$user_input_data['birthday_yy']}-{$user_input_data['birthday_mm']}-{$user_input_data['birthday_dd']}";
215
+ $birthday = "{$user_input_data['birthday_yy']}-{$user_input_data['birthday_mm']}-{$user_input_data['birthday_dd']}";
118
-
216
+
119
- $pre->bindValue(':birthday', $birthday, PDO::PARAM_STR);
217
+ $pre->bindValue(':birthday', $birthday, PDO::PARAM_STR);
120
-
218
+
121
- $pre->bindValue(':created', date(DATE_ATOM), PDO::PARAM_STR);
219
+ $pre->bindValue(':created', date(DATE_ATOM), PDO::PARAM_STR);
122
-
220
+
123
- $pre->bindValue(':updated', date(DATE_ATOM), PDO::PARAM_STR);
221
+ $pre->bindValue(':updated', date(DATE_ATOM), PDO::PARAM_STR);
124
-
222
+
125
- // SQLの実行
223
+ // SQLの実行
126
-
224
+
127
- $r = $pre->execute();
225
+ $r = $pre->execute();
226
+
128
-
227
+ }catch(PDOException $e){
228
+
229
+ var_dump($e);
230
+
231
+
232
+
129
- if (false === $r) {
233
+ if (false === $r) {
130
-
131
- // XXX 本当はもう少し丁寧なエラーページを出力する
234
+
132
-
133
- echo 'システムでエラーが起きました';
235
+ echo 'システムでエラーが起きました';
134
-
236
+
135
- exit;
237
+ exit;
238
+
239
+ }
240
+
241
+
242
+
243
+ }
136
244
 
137
245
  // ダミーのOK:後で削除する
138
246
 
@@ -142,6 +250,8 @@
142
250
 
143
251
 
144
252
 
253
+
254
+
255
+ みなさま色々な指摘ありがとうございます。
256
+
145
- dbへ接続部分と、INSERTの部分を削っ取りました。
257
+ form_insert.php中身を全載せさせいただきました。
146
-
147
- ご教授していただけると助かります。よろしくお願いします。