LoginSignup
1
0

PHP初級課題 ログインフォーム編

Posted at

前回課題と条件は同じです。
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>
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0