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

回答編集履歴

3

修正

2019/11/09 01:50

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -88,7 +88,7 @@
88
88
  この作りで`isset($_SESSION['customer'])`がfalseになるのって、ログインせずに直接list.phpにアクセスしたときくらいです。つまり、絶対にindex.htmlにリダイレクトされる運命しかありません。
89
89
  ログイン状態を保持するには「一定時間以内だったらログイン継続中」と判断がもう1つ必要です(別途回答がある通り)。
90
90
 
91
- いずれにしてもheader()の前に出力があるのでPHPの構文的にNGですし、なくしたら何も表示く勝手に戻される。
91
+ いずれにしてもheader()の前に出力があるのでPHPの構文的にNGですし、そのNG出力をなくしたら何も表示く勝手に戻される。
92
92
 
93
93
  **どうするか**
94
94
 

2

修正

2019/11/09 01:50

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -40,8 +40,47 @@
40
40
 
41
41
  と言うか[実行](https://www.php.net/manual/ja/pdostatement.execute.php)してないのにfetchAll()してますけど?
42
42
 
43
- 6.そりゃ速攻でログアウトしますわ
43
+ 6.きちんとコードフォーマットインデンよう。
44
+ login_output.phpをEclipseでフォーマットかけた上で、整理してみました。
45
+ 提示のコードとどっちが読みやすいか見比べてみると良いです。
46
+
47
+ ※ロジックは直してません。
44
48
  ```php
49
+ <?php
50
+ session_start();
51
+ unset($_SESSION["customer"]);
52
+
53
+ $pdo = new PDO("mysql:host=localhost;dbname=shop7;charset=utf8", "staff", "password");
54
+ $sql = $pdo->prepare("select*from customer where login=? and password=?");
55
+
56
+ foreach ($sql->fetchAll() as $row) {
57
+
58
+ $_SESSION["customer"] = [
59
+ "id" => $row["id"],
60
+ "name" => $row["name"],
61
+ "address" => $row["address"],
62
+ "login" => $row["login"],
63
+ "password" => $row["password"]
64
+ ];
65
+ }
66
+
67
+ if (isset($_SESSION["customer"])) {
68
+ echo "いらっしゃいませ", $_SESSION["customer"]["name"], "さん";
69
+
70
+ header('Location: list.php');
71
+ exit();
72
+ }
73
+ else {
74
+ echo "ログイン名またはパスワードが違います";
75
+ }
76
+
77
+ ```
78
+ 細かいこと言うとログイン後は[session_regenerate_id()](https://www.php.net/manual/ja/function.session-regenerate-id.php)を流した方が良いし、`$_SESSION["customer"]`のunset()はログイン時ではなくログアウト時(自動ログアウト含めて)であるべき。
79
+
80
+ # ここから本題
81
+
82
+ 7.そりゃ、速攻でログアウトしますわ
83
+ ```php
45
84
  //list.phpに入った時には$_SESSION['customer'])は絶対存在する仕組みになってるから
46
85
  if (isset($_SESSION['customer'])) {
47
86
  //ここは常にtrue
@@ -62,4 +101,8 @@
62
101
  仕様上は「認証されている人だけ見せる画面」であるはずですね。
63
102
  なので、「認証されている人だけに見せる画面」を「認証されていない、または一定時間操作がないタイムアウト状態の人」のために利用してはいけません。
64
103
 
65
- 何らかの方法を用いてタイムアウトしたことが分かる区分やフラグなどを渡してメッセージを表示させるのがベターなやり方です。(そこは考えてください。画面間情報の受け渡しなので手法はそこまで種類はありません)
104
+ 何らかの方法を用いてタイムアウトしたことが分かる区分やフラグなどを渡してメッセージを表示させるのがベターなやり方です。(そこは考えてください。画面間情報の受け渡しなので手法はそこまで種類はありません)
105
+
106
+ -------
107
+
108
+ 細かいことを言い続けるとキリがないので、他にも気になる点はたくさんありますが、この辺で。

1

修正

2019/11/08 12:20

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  ```
24
24
 
25
- 2.「意味のない空白行」という理由で ファイルの最後の?>もその後に出力ないなら不要。
25
+ 2.同じく「意味のない空白行」という理由で [ファイルの最後の?>もその後に出力ないなら不要](https://qiita.com/tadsan/items/fb496e450fc27c8c4494#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A8%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%AF%E5%88%86%E3%81%91%E3%82%8D)
26
26
 
27
27
  3.ini_set()するくらいならphp.iniの設定をいじった方が良い。
28
28