質問編集履歴

3

sy

2019/02/28 07:07

投稿

Roo
Roo

スコア55

test CHANGED
@@ -1 +1 @@
1
- バリデーションについて
1
+ sバリデーションについて
test CHANGED
@@ -446,8 +446,8 @@
446
446
 
447
447
  ###質問点
448
448
 
449
- 上記の形式だと.エラー文言を test_2.php で表示する仕様になっていますが、
449
+ 上記の形式だと.エラー文言を registration_mail_check.php で表示する仕様になっていますが、
450
-
450
+
451
- エラーが出た際に、test_1.phpにエラー文言を表示させたいです。
451
+ エラーが出た際に、registration_mail_form.php にエラー文言を表示させたいです。
452
452
 
453
453
  上記のどこのコードをどう修正すれば宜しいでしょうか?

2

修正

2019/02/28 07:07

投稿

Roo
Roo

スコア55

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 仮会員登録機能(POST)のみ:(test_1.php)
9
+ 仮会員登録機能(POST)のみ:(registration_mail_form.php)
10
10
 
11
11
  ```php
12
12
 
@@ -114,7 +114,7 @@
114
114
 
115
115
 
116
116
 
117
- ↓POSTされたトークン&メアド確認:(test_2.php)
117
+ ↓POSTされたトークン&メアド確認:(registration_mail_check.php)
118
118
 
119
119
  ```php
120
120
 

1

修正

2019/02/28 06:54

投稿

Roo
Roo

スコア55

test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  phpで仮会員登録機能実装中
4
4
 
5
+
6
+
7
+
8
+
5
- 仮会員登録機能
9
+ 仮会員登録機能(POST)のみ:(test_1.php)
6
-
7
-
8
10
 
9
11
  ```php
10
12
 
@@ -16,45 +18,353 @@
16
18
 
17
19
  header("Content-type: text/html; charset=utf-8");
18
20
 
19
-
20
-
21
-
22
-
23
- $errorMessage = "";
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
- // ログインボタンが押された場合
32
-
33
- if (isset($_POST["pre"])) {
34
-
35
- // 1. バリデーション
36
-
37
- if (empty($_POST["mail"])){
38
-
39
- $errorMessage = "メールが入力されていません。";
21
+
22
+
23
+ //クロスサイトリクエストフォージェリ(CSRF)対策
24
+
25
+ $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
26
+
27
+ $token = $_SESSION['token'];
28
+
29
+
30
+
31
+ //クリックジャッキング対策
32
+
33
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
34
+
35
+
36
+
37
+ ?>
38
+
39
+
40
+
41
+ <!DOCTYPE html>
42
+
43
+ <html>
44
+
45
+ <head>
46
+
47
+ <title>【DB課題】仮会員登録</title>
48
+
49
+ <meta charset="utf-8">
50
+
51
+ </head>
52
+
53
+ <body>
54
+
55
+ <h1>仮会員登録</h1>
56
+
57
+
58
+
59
+ ①メールアドレスの入力 ➡ ②仮会員登録完了
60
+
61
+
62
+
63
+ <p>メールアドレスを入力して「入力内容確認」ボタンを押してください。</p>
64
+
65
+ <p>入力されたメールアドレスに仮会員登録メールが届きますのでそちらに掲載されているURKより本登録が行えます</p>
66
+
67
+
68
+
69
+
70
+
71
+ <form action="registration_mail_check.php" method="post">
72
+
73
+
74
+
75
+ <p>メールアドレス 必須</p>
76
+
77
+ <input type="text" name="mail" size="50">
78
+
79
+
80
+
81
+
82
+
83
+ <p>メールアドレス (確認用) 必須</p>
84
+
85
+ <input type="text" name="mail_2" size="50">
86
+
87
+
88
+
89
+
90
+
91
+ <p><input type="hidden" name="token" value="<?=$token?>"></p>
92
+
93
+ <input type="submit" value="登録する">
94
+
95
+
96
+
97
+ </form>
98
+
99
+
100
+
101
+
102
+
103
+ </body>
104
+
105
+ </html>
106
+
107
+ ```
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ ↓POSTされたトークン&メアド確認:(test_2.php)
118
+
119
+ ```php
120
+
121
+ <?php
122
+
123
+ session_start();
124
+
125
+
126
+
127
+ header("Content-type: text/html;unix_socket=/tmp/mysql.sock;charset=utf-8");
128
+
129
+
130
+
131
+ //クロスサイトリクエストフォージェリ(CSRF)対策のトークン判定
132
+
133
+ if ($_POST['token'] != $_SESSION['token']){
134
+
135
+ echo "不正アクセスの可能性あり";
136
+
137
+ exit();
138
+
139
+ }
140
+
141
+
142
+
143
+ //クリックジャッキング対策
144
+
145
+ header('X-FRAME-OPTIONS: SAMEORIGIN');
146
+
147
+
148
+
149
+ //データベース接続
150
+
151
+ require_once("db.php");
152
+
153
+ $dbh = db_connect();
154
+
155
+
156
+
157
+
158
+
159
+ //エラーメッセージの初期化
160
+
161
+ $errors = array();
162
+
163
+
164
+
165
+ if(empty($_POST)) {
166
+
167
+ header("Location: registration_mail_form.php");
168
+
169
+ exit();
170
+
171
+ }else{
172
+
173
+ //POSTされたデータを変数に入れる
174
+
175
+ $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL;
176
+
177
+
178
+
179
+ //メール入力判定
180
+
181
+ if ($mail == ''){
182
+
183
+ $errors['mail'] = "メールが入力されていません。";
40
184
 
41
185
  }else{
42
186
 
43
- if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST["mail"])){
187
+ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $mail)){
44
-
188
+
45
- $errorMessage = "メールアドレスの形式が正しくありません。";
189
+ $errors['mail_check'] = "メールアドレスの形式が正しくありません。";
190
+
46
-
191
+ }
192
+
193
+ require_once("db.php");
194
+
195
+ $dbh = db_connect();
196
+
197
+
198
+
199
+ function emailExists($email, $dbh){
200
+
201
+ $sql = "select * from pre_member where email = :email limit 1";
202
+
203
+ $stmt = $dbh->prepare($sql);
204
+
205
+ $stmt->execute(array(":email" => $email));
206
+
207
+ $user = $stmt->fetch();
208
+
47
- }else{
209
+ return $user ? true : false;
48
-
49
-
50
210
 
51
211
  }
52
212
 
213
+ }
214
+
53
215
  }
54
216
 
217
+
218
+
55
-
219
+ if (count($errors) === 0){
220
+
221
+
222
+
56
-
223
+ $urltoken = hash('sha256',uniqid(rand(),1));
224
+
57
-
225
+ $url = "http://www1002uj.sakura.ne.jp/registration/registration_form.php"."?urltoken=".$urltoken;
226
+
227
+
228
+
229
+ //ここでデータベースに登録する
230
+
231
+ try{
232
+
233
+ //例外処理を投げる(スロー)ようにする
234
+
235
+ $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
236
+
237
+
238
+
239
+ $statement = $dbh->prepare("INSERT INTO pre_member (urltoken,mail,date) VALUES (:urltoken,:mail,now() )");
240
+
241
+
242
+
243
+ //プレースホルダへ実際の値を設定する
244
+
245
+ $statement->bindValue(':urltoken', $urltoken, PDO::PARAM_STR);
246
+
247
+ $statement->bindValue(':mail', $mail, PDO::PARAM_STR);
248
+
249
+ $statement->execute();
250
+
251
+
252
+
253
+ //データベース接続切断
254
+
255
+ // $dbh = null;
256
+
257
+
258
+
259
+ }catch (PDOException $e){
260
+
261
+ $e->getMessage();
262
+
263
+ echo $e->getMessage();
264
+
265
+ $e->getLine();
266
+
267
+ echo $e->getLine();
268
+
269
+ // print('Error:'.$e->getMessage());
270
+
271
+ // die();
272
+
273
+ }
274
+
275
+
276
+
277
+ //メールの宛先
278
+
279
+ $mailTo = $mail;
280
+
281
+
282
+
283
+ //Return-Pathに指定するメールアドレス
284
+
285
+ $returnMail = 'web@sample.com';
286
+
287
+
288
+
289
+ $name = "仮会員登録機能【DB課題】";
290
+
291
+ $mail = '';
292
+
293
+ $subject = "仮会員登録ありがとうございます";
294
+
295
+
296
+
297
+ $body = <<< EOM
298
+
299
+ 仮会員登録完了
300
+
301
+ 下記のURLから新規会員登録に移動して下さい。
302
+
303
+ {$url}
304
+
305
+
306
+
307
+ ※このメールは送信専用メールアドレスから配信されています。
308
+
309
+ ご返信いただいてもお答えできませんのでご了承下さい。
310
+
311
+ URLの期限は24時間となっております。
312
+
313
+ EOM;
314
+
315
+
316
+
317
+ mb_language('ja');
318
+
319
+ mb_internal_encoding('UTF-8');
320
+
321
+
322
+
323
+ //Fromヘッダーを作成
324
+
325
+ $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>';
326
+
327
+
328
+
329
+ if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) {
330
+
331
+
332
+
333
+ //セッション変数を全て解除
334
+
335
+ $_SESSION = array();
336
+
337
+
338
+
339
+ //クッキーの削除
340
+
341
+ if (isset($_COOKIE["PHPSESSID"])) {
342
+
343
+ setcookie("PHPSESSID", '', time() - 1800, '/');
344
+
345
+ }
346
+
347
+
348
+
349
+ //セッションを破棄する
350
+
351
+ session_destroy();
352
+
353
+
354
+
355
+ $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。";
356
+
357
+
358
+
359
+ } else {
360
+
361
+ $errors['mail_error'] = "メールの送信に失敗しました。";
362
+
363
+ }
364
+
365
+ }
366
+
367
+
58
368
 
59
369
  ?>
60
370
 
@@ -66,7 +376,7 @@
66
376
 
67
377
  <head>
68
378
 
69
- <title>【DB課題】仮会員登録</title>
379
+ <title>メール確認画面</title>
70
380
 
71
381
  <meta charset="utf-8">
72
382
 
@@ -74,51 +384,47 @@
74
384
 
75
385
  <body>
76
386
 
77
- <h1>仮会員登録</h1>
387
+ <h1>メール確認画面</h1>
78
-
79
-
80
-
81
- ①メールアドレスの入力 ➡ ②仮会員登録完了
388
+
82
-
83
-
84
-
85
- <p>メールアドレスを入力して「入力内容確認」ボタンを押してください。</p>
389
+
86
-
87
- <p>入力されたメールアドレスに仮会員登録メールが届きますのでそちらに掲載されているURKより本登録が行えます</p>
390
+
88
-
89
-
90
-
91
-
92
-
93
- <form action="registration_mail_check.php" method="post">
94
-
95
- <p>メールアドレス 必須</p>
391
+ <?php if (count($errors) === 0): ?>
96
-
97
- <input type="text" id="mail" name="mail" size="50">
392
+
98
-
99
-
100
-
101
- <div><font color="#ff0000"><?php echo htmlspecialchars($errorMessage, ENT_QUOTES); ?></font></div>
393
+
102
-
103
-
104
-
394
+
105
- <p>メールアドレス (確認用) 必須</p>
395
+ <p><?=$message?></p>
396
+
397
+
398
+
106
-
399
+ <p>↓このURLが記載されたメールが届きます。</p>
400
+
401
+ <a href="<?=$url?>"><?=$url?></a>
402
+
403
+
404
+
405
+ <?php elseif(count($errors) > 0): ?>
406
+
407
+
408
+
409
+ <?php
410
+
411
+ foreach($errors as $value){
412
+
413
+ echo "<p>".$value."</p>";
414
+
415
+ }
416
+
417
+ ?>
418
+
419
+
420
+
107
- <input type="text" name="mail_2" size="50">
421
+ <input type="button" value="戻る" onClick="history.back()">
108
-
109
-
110
-
111
- echo("$errorMessage")
422
+
112
-
113
-
114
-
115
- <p><input type="hidden" name="token" value="<?=$token?>"></p>
423
+
116
-
117
- <input type="submit" id="pre" value="登録する" name="pre">
424
+
118
-
119
-
120
-
121
- </form>
425
+ <?php endif; ?>
426
+
427
+
122
428
 
123
429
  </body>
124
430
 
@@ -128,18 +434,20 @@
128
434
 
129
435
 
130
436
 
131
- ###疑問点
437
+ +DB接続のファイル
132
-
133
-
134
-
135
- <form action="registration_mail_check.php" method="post">
438
+
136
-
137
- こちらる場合、バリデーションがかからず処理が走り
439
+ の上三つのファイル構成で仮会員登録を行っていま
138
-
139
- なしだとバリデーションが掛かります。
440
+
441
+
442
+
443
+
140
444
 
141
445
 
142
446
 
143
447
  ###質問点
144
448
 
449
+ 上記の形式だと.エラー文言を test_2.php で表示する仕様になっていますが、
450
+
451
+ エラーが出た際に、test_1.phpにエラー文言を表示させたいです。
452
+
145
453
  上記のどこのコードをどう修正すれば宜しいでしょうか?