0
0

More than 1 year has passed since last update.

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

Posted at

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の後ろにくっつけています。

0
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
0
0