前回課題と条件は同じです。
https://qiita.com/pig_buhi555/items/bc88d724523753808a22
1.課題
Controllers/LoginController.php
<?php
require(__DIR__ . "/../Models/LoginModel.php");
$LoginController = new LoginController;
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$LoginController->login();
} elseif($_SERVER["REQUEST_METHOD"] == "GET") {
$LoginController->logout();
}
class LoginController
{
public function __construct() {
$this->LoginModel = new LoginModel;
}
public function login() {
// ② アカウント情報取得
$user = $this->LoginModel->getUserInfo();
// ④ アカウントが存在するかチェックする
if() {
// ⑤ 取得したハッシュ化したパスワードと、入力したパスワードが正しいかどうか調べる
if() {
// ⑥ admin_userとadmin_flgはセッションに保存する(ログイン)
}
}
// ⑦ ログインできていれば、view/admin/success.phpへリダイレクトする。
// 失敗したらview/admin/login.phpへリダイレクトする
}
public function logout() {
// ⑨ セッション削除
// ⑩ セッション削除後、ログインフォームへリダイレクトする
}
}
Models/LoginModel.php
<?php
class LoginModel
{
// 接続情報
const DSN = 'mysql:dbname=board;host=127.0.0.1';
const USER = 'root';
const PASSWORD = '';
public function __construct() {
$this->dbh = new PDO(self::DSN, self::USER, self::PASSWORD);
}
public function getUserInfo() {
// ③ delete_flgが'0' 且つ delete_dateはNULLの条件は必須でアカウントデータ取得
$sql = "";
}
}
view/admin/login.php
<html>
<head>
<title>掲示板 登録フォーム</title>
</head>
<body>
<form method="post" action='../../Controllers/LoginController.php'>
<h1>管理画面</h1>
<li>ユーザーID</li>
<input type="text" name="user_id">
<li>パスワード</li>
<!--- ① 入力したら「*******」と表示されるテキストボックスにする --->
<input type="" name="login_password">
<br><br>
<input type="submit" value="ログイン">
</form>
</body>
</html>
view/admin/success.php
<?php
// ⑧ セッションを取得できれば本画面を表示し、なければview/admin/login.phpへ遷移する
?>
<!--- この画面はログインしている時以外は表示させないようにする --->
<html>
<head>
<title>掲示板 登録フォーム</title>
</head>
<body>
ログイン成功<br>
<a href="/../../Controllers/LoginController.php">ログアウト</a>
</body>
</html>
2.模範解答
Controllers/LoginController.php
<?php
require(__DIR__ . "/../Models/LoginModel.php");
$LoginController = new LoginController;
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$LoginController->login();
} elseif($_SERVER["REQUEST_METHOD"] == "GET") {
$LoginController->logout();
}
class LoginController
{
public function __construct() {
$this->LoginModel = new LoginModel;
}
public function login() {
// セッション開始
session_start();
// アカウント存在チェック
$user = $this->LoginModel->getUserInfo();
$login_flg = false;
// ハッシュ化したパスワードが正しいかどうか調べる(本課題のハッシュ値は)
if(count($user) == 1) {
if(password_verify($_POST["login_password"], $user[0]['password'])) {
$login_flg = true;
$_SESSION["admin_user"] = $user[0]["user_id"];
$_SESSION["admin_flg"] = $user[0]["admin_flg"];
}
}
if($login_flg) {
// 正しければログイン/間違えていればログインフォームへ戻る
header("Location: /../view/admin/success.php");
} else {
header("Location: /../view/admin/login.php");
}
exit;
}
public function logout() {
// セッション開始
session_start();
// セッション変数を全て削除
$_SESSION = array();
session_destroy();
$messege = "ログアウトが完了しました";
// セッション削除後、ログインフォームへ戻る。この時、ログアウト用のメッセージを画面に表示する
header("Location: /../view/admin/login.php");
exit;
}
}
Models/LoginModel.php
<?php
class LoginModel
{
// 接続情報
const DSN = 'mysql:dbname=board;host=127.0.0.1';
const USER = 'root';
const PASSWORD = '';
public function __construct() {
$this->dbh = new PDO(self::DSN, self::USER, self::PASSWORD);
}
public function getUserInfo() {
$sql = "SELECT * FROM t_admin_account WHERE delete_flg = '0' AND delete_date IS NULL AND user_id = " . "'" . $_POST["user_id"] . "'";
// 登録データ全件取得
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
$data = $stmt->fetchAll();
// DB切断
$this->dbh = null;
return $data;
}
}
view/admin/login.php
<html>
<head>
<title>掲示板 登録フォーム</title>
</head>
<body>
<form method="post" action='../../Controllers/LoginController.php'>
<h1>管理画面</h1>
<li>ユーザーID</li>
<input type="text" name="user_id">
<li>パスワード</li>
<input type="password" name="login_password">
<br><br>
<input type="submit" value="ログイン">
</form>
</body>
</html>
view/admin/success.php
<?php
// セッション開始
session_start();
if(empty($_SESSION)) {
header("Location: /view/admin/login.php");
}
?>
<html>
<head>
<title>掲示板 登録フォーム</title>
</head>
<body>
ログイン成功<br>
<a href="/../../Controllers/LoginController.php">ログアウト</a>
</body>
</html>