回答編集履歴

2

修正

2016/12/20 13:51

投稿

s8_chu
s8_chu

スコア14731

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  $db['user'] = "root"; // ユーザー名
14
14
 
15
- $db['pass'] = "3141592653589793238462643383279"; // ユーザー名のパスワード
15
+ $db['pass'] = "pass"; // ユーザー名のパスワード
16
16
 
17
17
  $db['dbname'] = "loginManagement"; // データベース名
18
18
 

1

修正

2016/12/20 13:51

投稿

s8_chu
s8_chu

スコア14731

test CHANGED
@@ -12,35 +12,245 @@
12
12
 
13
13
  $db['user'] = "root"; // ユーザー名
14
14
 
15
+ $db['pass'] = "3141592653589793238462643383279"; // ユーザー名のパスワード
16
+
17
+ $db['dbname'] = "loginManagement"; // データベース名
18
+
19
+ $errorMessage = "";
20
+
21
+
22
+
23
+ // ログインボタンが押された場合
24
+
25
+ if (isset($_POST["login"])) {
26
+
27
+ // 1. ユーザIDの入力チェック
28
+
29
+ if (empty($_POST["mailaddress"])) { // emptyは値が空のとき
30
+
31
+ $errorMessage = 'ユーザーIDが未入力です。';
32
+
33
+ } else if (empty($_POST["password"])) {
34
+
35
+ $errorMessage = 'パスワードが未入力です。';
36
+
37
+ }
38
+
39
+
40
+
41
+ if (!empty($_POST["mailaddress"]) && !empty($_POST["password"])) {
42
+
43
+ // 入力したユーザIDを格納
44
+
45
+ $mailaddress = $_POST["mailaddress"];
46
+
47
+
48
+
49
+ // 2. ユーザIDとパスワードが入力されていたら認証する
50
+
51
+ $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']);
52
+
53
+
54
+
55
+ // 3. エラー処理
56
+
57
+ try {
58
+
59
+ $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
60
+
61
+
62
+
63
+ $stmt = $pdo->prepare('SELECT * FROM userData WHERE mailaddress = :mailaddress');
64
+
65
+ $stmt->execute(array(":mailaddress" => $mailaddress));
66
+
67
+
68
+
69
+ $password = $_POST["password"];
70
+
71
+
72
+
73
+ if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
74
+
75
+ if (password_verify($password, $row['password'])) {
76
+
77
+ session_regenerate_id(true);
78
+
79
+
80
+
81
+ $_SESSION["USERID"] = $row['mailaddress'];
82
+
83
+ header("Location: Main.php"); // メイン画面へ遷移
84
+
85
+ exit(); // 処理終了
86
+
87
+ } else {
88
+
89
+ // 認証失敗
90
+
91
+ $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
92
+
93
+ }
94
+
95
+ } else {
96
+
97
+ // 4. 認証成功なら、セッションIDを新規に発行する
98
+
99
+ // 該当データなし
100
+
101
+ $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
102
+
103
+ }
104
+
105
+ } catch (PDOException $e) {
106
+
107
+ $errorMessage = 'データベースエラー';
108
+
109
+ //$errorMessage = $sql;
110
+
111
+ // $e->getMessage() でエラー内容を参照可能(デバック時のみ表示)
112
+
113
+ // echo $e->getMessage();
114
+
115
+ }
116
+
117
+ }
118
+
119
+ }
120
+
121
+ ?>
122
+
123
+
124
+
125
+ <!doctype html>
126
+
127
+ <html>
128
+
129
+ <head>
130
+
131
+ <meta charset="UTF-8">
132
+
133
+ <title>ログイン</title>
134
+
135
+ </head>
136
+
137
+ <body>
138
+
139
+ <h1>ログイン画面</h1>
140
+
141
+ <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
142
+
143
+ <!-- <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST"> -->
144
+
145
+ <form id="loginForm" name="loginForm" action="" method="POST">
146
+
147
+ <fieldset>
148
+
149
+ <legend>ログインフォーム</legend>
150
+
151
+ <div><font color="#ff0000"><?php echo $errorMessage ?></font></div>
152
+
153
+ <label for="mailaddress">ユーザーID</label><input type="text" id="mailaddress" name="mailaddress"
154
+
155
+ placeholder="ユーザーIDを入力"
156
+
157
+ value="<?php if (!empty($_POST["userid"])) {
158
+
159
+ echo htmlspecialchars($_POST["userid"], ENT_QUOTES);
160
+
161
+ } ?>">
162
+
163
+ <br>
164
+
165
+ <label for="password">パスワード</label><input type="password" id="password" name="password" value=""
166
+
167
+ placeholder="パスワードを入力">
168
+
169
+ <br>
170
+
171
+ <input type="submit" id="login" name="login" value="ログイン">
172
+
173
+ </fieldset>
174
+
175
+ </form>
176
+
177
+ <br>
178
+
179
+ <form action="SignUp.php">
180
+
181
+ <fieldset>
182
+
183
+ <legend>新規登録フォーム</legend>
184
+
185
+ <input type="submit" value="新規登録">
186
+
187
+ </fieldset>
188
+
189
+ </form>
190
+
191
+ </body>
192
+
193
+ </html>
194
+
195
+ ```
196
+
197
+ ちなみに、メールアドレスでの登録ということは、新規登録のときに[filter_var関数](http://php.net/manual/ja/function.filter-var.php)などで**ユーザーが入力した文字列がメールアドレスの形式なのかチェックする**必要があると思います。質問者さんはこちらもリンクしているページの新規登録を参考にしていると思うので、メールアドレスのチェックを加えたコードを以下に書いておきます。
198
+
199
+ ```PHP
200
+
201
+ <?php
202
+
203
+ session_start();
204
+
205
+
206
+
207
+ $db['host'] = "localhost"; // DBサーバのURL
208
+
209
+ $db['user'] = "root"; // ユーザー名
210
+
15
211
  $db['pass'] = "pass"; // ユーザー名のパスワード
16
212
 
17
213
  $db['dbname'] = "loginManagement"; // データベース名
18
214
 
215
+
216
+
217
+ // エラーメッセージ、登録完了メッセージの初期化
218
+
19
219
  $errorMessage = "";
20
220
 
221
+ $SignUpMessage = "";
222
+
223
+
224
+
21
225
  // ログインボタンが押された場合
22
226
 
23
- if (isset($_POST["login"])) {
227
+ if (isset($_POST["signUp"])) {
24
228
 
25
229
  // 1. ユーザIDの入力チェック
26
230
 
27
- if (empty($_POST["userid"])) { // emptyは値が空のとき
231
+ if (empty($_POST["mailaddress"])) { // 値が空のとき
28
-
232
+
29
- $errorMessage = 'ユーザーIDが未入力です。';
233
+ $errorMessage = 'mailaddressが未入力です。';
30
234
 
31
235
  } else if (empty($_POST["password"])) {
32
236
 
33
237
  $errorMessage = 'パスワードが未入力です。';
34
238
 
239
+ } else if (empty($_POST["password2"])) {
240
+
241
+ $errorMessage = 'パスワードが未入力です。';
242
+
35
243
  }
36
244
 
37
245
 
38
246
 
39
- if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
40
-
41
- // 入力したユーザIDを格納
42
-
43
- $userid = $_POST["userid"];
247
+ if (!empty($_POST["mailaddress"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] == $_POST["password2"] && filter_var($_POST['mailaddress'], FILTER_VALIDATE_EMAIL)) {
248
+
249
+ // 入力したユーザIDとパスワードを格納
250
+
251
+ $mailaddress = $_POST["mailaddress"];
252
+
253
+ $password = $_POST["password"];
44
254
 
45
255
 
46
256
 
@@ -58,60 +268,36 @@
58
268
 
59
269
 
60
270
 
61
- $stmt = $pdo->prepare('SELECT * FROM userData WHERE mailaddress = :mailaddress');
271
+ $stmt = $pdo->prepare("INSERT INTO userData(mailaddress, password) VALUES (?, ?)");
272
+
273
+
274
+
62
-
275
+ $stmt->execute(array($mailaddress, password_hash($password, PASSWORD_DEFAULT))); // パスワードのハッシュ化を行う(今回は文字列のみなのでbindValue(変数の内容が変わらない)を使用せず、直接excuteに渡しても問題ない)
276
+
63
- $stmt->execute(array(":mailaddress" => $userid));
277
+ $userid = $pdo->lastinsertid(); // 登録した(DB側でauto_incrementした)IDを$useridに入れる
64
-
65
-
66
-
67
- $password = $_POST["password"];
278
+
68
-
69
-
70
-
71
- if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
279
+
72
-
73
- if (password_verify($password, $row['password'])) {
280
+
74
-
75
- session_regenerate_id(true);
76
-
77
-
78
-
79
- $_SESSION["USERID"] = $row['mailaddress'];
80
-
81
- header("Location: Main.php"); // メイン画面へ遷移
82
-
83
- exit(); // 処理終了
84
-
85
- } else {
86
-
87
- // 認証失敗
88
-
89
- $errorMessage = 'ユーザIDあるいはパスワードに誤りがあります。';
281
+ $SignUpMessage = '登録が完了しました。あなたの登録ユーザIDは ' . $userid . ' です。パスワードは ' . $password . ' です。'; // ログイン時に使用するIDとパスワード
90
-
91
- }
92
-
93
- } else {
94
-
95
- // 4. 認証成功なら、セッションIDを新規に発行する
96
-
97
- // 該当データなし
98
-
99
- $errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
100
-
101
- }
102
282
 
103
283
  } catch (PDOException $e) {
104
284
 
105
285
  $errorMessage = 'データベースエラー';
106
286
 
107
- //$errorMessage = $sql;
108
-
109
287
  // $e->getMessage() でエラー内容を参照可能(デバック時のみ表示)
110
288
 
111
289
  // echo $e->getMessage();
112
290
 
113
291
  }
114
292
 
293
+ } elseif ($_POST["password"] != $_POST["password2"]) {
294
+
295
+ $errorMessage = 'パスワードに誤りがあります。';
296
+
297
+ } elseif (filter_var($_POST['mailaddress'], FILTER_VALIDATE_EMAIL) == false) {
298
+
299
+ $errorMessage = 'メールアドレスの書式が間違っています。';
300
+
115
301
  }
116
302
 
117
303
  }
@@ -128,13 +314,13 @@
128
314
 
129
315
  <meta charset="UTF-8">
130
316
 
131
- <title>ログイン</title>
317
+ <title>新規登録</title>
132
318
 
133
319
  </head>
134
320
 
135
321
  <body>
136
322
 
137
- <h1>ログイン画面</h1>
323
+ <h1>新規登録画面</h1>
138
324
 
139
325
  <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
140
326
 
@@ -144,17 +330,21 @@
144
330
 
145
331
  <fieldset>
146
332
 
147
- <legend>ログインフォーム</legend>
333
+ <legend>新規登録フォーム</legend>
148
334
 
149
335
  <div><font color="#ff0000"><?php echo $errorMessage ?></font></div>
150
336
 
337
+ <div><font color="#0000ff"><?php echo $SignUpMessage ?></font></div>
338
+
151
- <label for="userid">ユーザーID</label><input type="text" id="userid" name="userid" placeholder="ユーザーIDを入力"
339
+ <label for="mailaddress">ユーザー</label><input type="text" id="mailaddress" name="mailaddress"
340
+
152
-
341
+ placeholder="ユーザー名を入力"
342
+
153
- value="<?php if (!empty($_POST["userid"])) {
343
+ value="<?php if (!empty($_POST["mailaddress"])) {
154
-
344
+
155
- echo htmlspecialchars($_POST["userid"], ENT_QUOTES);
345
+ echo htmlspecialchars($_POST["mailaddress"], ENT_QUOTES);
156
-
346
+
157
- } ?>">
347
+ } ?>">
158
348
 
159
349
  <br>
160
350
 
@@ -164,7 +354,13 @@
164
354
 
165
355
  <br>
166
356
 
357
+ <label for="password2">パスワード(確認用)</label><input type="password" id="password2" name="password2" value=""
358
+
359
+ placeholder="再度パスワードを入力">
360
+
361
+ <br>
362
+
167
- <input type="submit" id="login" name="login" value="ログイン">
363
+ <input type="submit" id="signUp" name="signUp" value="新規登録">
168
364
 
169
365
  </fieldset>
170
366
 
@@ -172,15 +368,9 @@
172
368
 
173
369
  <br>
174
370
 
175
- <form action="SignUp.php">
371
+ <form action="Login.php">
176
-
177
- <fieldset>
372
+
178
-
179
- <legend>新規登録フォーム</legend>
180
-
181
- <input type="submit" value="新規登録">
373
+ <input type="submit" value="戻る">
182
-
183
- </fieldset>
184
374
 
185
375
  </form>
186
376
 
@@ -189,189 +379,3 @@
189
379
  </html>
190
380
 
191
381
  ```
192
-
193
- ちなみに、メールアドレスでの登録ということは、新規登録のときに[filter_var関数](http://php.net/manual/ja/function.filter-var.php)などで**ユーザーが入力した文字列がメールアドレスの形式なのかチェックする**必要があると思います。質問者さんはこちらもリンクしているページの新規登録を参考にしていると思うので、メールアドレスのチェックを加えたコードを以下に書いておきます。
194
-
195
- ```PHP
196
-
197
- <?php
198
-
199
- session_start();
200
-
201
-
202
-
203
- $db['host'] = "localhost"; // DBサーバのURL
204
-
205
- $db['user'] = "root"; // ユーザー名
206
-
207
- $db['pass'] = "pass"; // ユーザー名のパスワード
208
-
209
- $db['dbname'] = "loginManagement"; // データベース名
210
-
211
-
212
-
213
- // エラーメッセージ、登録完了メッセージの初期化
214
-
215
- $errorMessage = "";
216
-
217
- $SignUpMessage = "";
218
-
219
-
220
-
221
- // ログインボタンが押された場合
222
-
223
- if (isset($_POST["signUp"])) {
224
-
225
- // 1. ユーザIDの入力チェック
226
-
227
- if (empty($_POST["mailaddress"])) { // 値が空のとき
228
-
229
- $errorMessage = 'mailaddressが未入力です。';
230
-
231
- } else if (empty($_POST["password"])) {
232
-
233
- $errorMessage = 'パスワードが未入力です。';
234
-
235
- } else if (empty($_POST["password2"])) {
236
-
237
- $errorMessage = 'パスワードが未入力です。';
238
-
239
- }
240
-
241
-
242
-
243
- if (!empty($_POST["mailaddress"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] == $_POST["password2"] && filter_var($_POST['mailaddress'], FILTER_VALIDATE_EMAIL)) {
244
-
245
- // 入力したユーザIDとパスワードを格納
246
-
247
- $mailaddress = $_POST["mailaddress"];
248
-
249
- $password = $_POST["password"];
250
-
251
-
252
-
253
- // 2. ユーザIDとパスワードが入力されていたら認証する
254
-
255
- $dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']);
256
-
257
-
258
-
259
- // 3. エラー処理
260
-
261
- try {
262
-
263
- $pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
264
-
265
-
266
-
267
- $stmt = $pdo->prepare("INSERT INTO userData(mailaddress, password) VALUES (?, ?)");
268
-
269
-
270
-
271
- $stmt->execute(array($mailaddress, password_hash($password, PASSWORD_DEFAULT))); // パスワードのハッシュ化を行う(今回は文字列のみなのでbindValue(変数の内容が変わらない)を使用せず、直接excuteに渡しても問題ない)
272
-
273
- $userid = $pdo->lastinsertid(); // 登録した(DB側でauto_incrementした)IDを$useridに入れる
274
-
275
-
276
-
277
- $SignUpMessage = '登録が完了しました。あなたの登録ユーザIDは ' . $userid . ' です。パスワードは ' . $password . ' です。'; // ログイン時に使用するIDとパスワード
278
-
279
- } catch (PDOException $e) {
280
-
281
- $errorMessage = 'データベースエラー';
282
-
283
- // $e->getMessage() でエラー内容を参照可能(デバック時のみ表示)
284
-
285
- // echo $e->getMessage();
286
-
287
- }
288
-
289
- } elseif ($_POST["password"] != $_POST["password2"]) {
290
-
291
- $errorMessage = 'パスワードに誤りがあります。';
292
-
293
- } elseif (filter_var($_POST['mailaddress'], FILTER_VALIDATE_EMAIL) == false) {
294
-
295
- $errorMessage = 'メールアドレスの書式が間違っています。';
296
-
297
- }
298
-
299
- }
300
-
301
- ?>
302
-
303
-
304
-
305
- <!doctype html>
306
-
307
- <html>
308
-
309
- <head>
310
-
311
- <meta charset="UTF-8">
312
-
313
- <title>新規登録</title>
314
-
315
- </head>
316
-
317
- <body>
318
-
319
- <h1>新規登録画面</h1>
320
-
321
- <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
322
-
323
- <!-- <form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST"> -->
324
-
325
- <form id="loginForm" name="loginForm" action="" method="POST">
326
-
327
- <fieldset>
328
-
329
- <legend>新規登録フォーム</legend>
330
-
331
- <div><font color="#ff0000"><?php echo $errorMessage ?></font></div>
332
-
333
- <div><font color="#0000ff"><?php echo $SignUpMessage ?></font></div>
334
-
335
- <label for="mailaddress">ユーザー名</label><input type="text" id="mailaddress" name="mailaddress"
336
-
337
- placeholder="ユーザー名を入力"
338
-
339
- value="<?php if (!empty($_POST["mailaddress"])) {
340
-
341
- echo htmlspecialchars($_POST["mailaddress"], ENT_QUOTES);
342
-
343
- } ?>">
344
-
345
- <br>
346
-
347
- <label for="password">パスワード</label><input type="password" id="password" name="password" value=""
348
-
349
- placeholder="パスワードを入力">
350
-
351
- <br>
352
-
353
- <label for="password2">パスワード(確認用)</label><input type="password" id="password2" name="password2" value=""
354
-
355
- placeholder="再度パスワードを入力">
356
-
357
- <br>
358
-
359
- <input type="submit" id="signUp" name="signUp" value="新規登録">
360
-
361
- </fieldset>
362
-
363
- </form>
364
-
365
- <br>
366
-
367
- <form action="Login.php">
368
-
369
- <input type="submit" value="戻る">
370
-
371
- </form>
372
-
373
- </body>
374
-
375
- </html>
376
-
377
- ```