PHPでログインフォームを作成してみました。

# PHPでログインフォームを作ってみました
開発環境
・M1 MacBook
・MAMP
・PHP フレームワーク無し
・HTML5
・phpmyAdmin
・エディタ vscode

## コード一覧　（会員登録は載せていません）

```
<?php
// function読み込み
require('../db.php');

// error回避のために配列を初期化
$error = [];
$email = '';
$password = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    // ユーザの入力情報を変数に代入
    $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

    // 何も入力しないでログインしようとした場合のバリデーション
    if ($email === '') {
        $error['login'] = 'blank';
    }

    // 何も入力しないでログインしようとした場合のバリデーション
    if ($password === '') {
        $error['login2'] = 'blank';
    } else {

        // データベースとの接続
        $db = new mysqli('localhost', 'root', 'root', 'user_db');

        // SQL発行
        $stmt = $db->prepare('SELECT id, name, password, uuid FROM members WHERE email=? LIMIT 1');

        // ユーザーが入力したメールアドレスに存在するデーターを呼び出す
        $stmt->bind_param('s', $email);

        // SQL実行
        $success = $stmt->execute();

        // 取得したデータを変数に置き換える
        $stmt->bind_result($id, $name, $hash, $uuid);
        $stmt->fetch();

        // 暗号化されたパスワードとユーザーが入力したパスワードが一致しているか確認
        if (password_verify($password, $hash)) {

            // 一致した場合はセッションを発酵する
            session_start();
            $ses_id = session_id() . $uuid;

            // グローバル変数に置き換えておく
            $_SESSION['id'] = $ses_id;
            $_SESSION['user_id'] = $id;
            $_SESSION['user_name'] = $name;

            // このデータを持ち、トップページへ移動する
            header('Location: ../Home-index/home.php');
            exit();
        } else {

            // ログインできなかった時のバリデーション
            $error['login'] = 'failed';
        }
    }
}
?>

<!DOCTYPE html>

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="../Css/login.css">
    <!-- タイトル　Log in　で指定 -->
    <title>Real intentioNにログイン / Real intentioN</title>
    <!-- ファビコンの読み込み -->
    <link rel="icon" href="../img/名称未設定-3.png">
</head>

<body>
    <div class="card">
        <div class="content">
            <h2>ログイン</h2>
            <form action="" method="post">

                <!-- メールアドレスのテェック -->
                <div class="user-box">
                    <label>Email</label>
                    <input type="email" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($email); ?>" required>


                </div>

                <!-- パスワードのテェック -->
                <div class="user-box">
                    <label>Password</label>
                    <input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars($password); ?>" required>



                    <!-- ログイン不成立のバリデーション -->
                    <?php if (isset($error['login']) && $error['login'] === 'failed') : ?>
                        <p class="error">*ログインに失敗しました。正しくご記入ください。</p>
                    <?php endif; ?>
                </div>

                <!-- ログインボタンの装飾 -->
                <button>

                    ログイン
                </button>
            </form>

            <div class="guidance">
                <a href="../Register/welcome.php">会員登録はこちら&gt;&gt;</a>
            </div>

            <div class="guidance2">
                <a href="../password_reset/password.php">パスワードを忘れた方はこちら&gt;&gt;</a>
            </div>
        </div>
    </div>
</body>

</html>

```

## コードポイント解説
```
if (password_verify($password, $hash)) {

            // 一致した場合はセッションを発酵する
            session_start();
            $ses_id = session_id() . $uuid;

            // グローバル変数に置き換えておく
            $_SESSION['id'] = $ses_id;
            $_SESSION['user_id'] = $id;
            $_SESSION['user_name'] = $name;

            // このデータを持ち、トップページへ移動する
            header('Location: ../Home-index/home.php');
            exit();
        } else {

            // ログインできなかった時のバリデーション
            $error['login'] = 'failed';
        }
```
password_verifyでユーザーが入力したパスワードとDBに入っている暗号化されているパスワードの比較をしています。

比較して認証に成功したらセッションIDを発行しています。

セッションIDを予測されないようにランダムな文字列をセッションIDの後ろにくっつけています。