【PHPでのログイン処理の実装方法】セッションとは何か?

login Webエンジニア

前回の記事「【PHPでwebアプリを作る】登録フォームでユーザーの新規登録をする」でユーザーの新規登録を作成しました。

今度はそのユーザーでのログイン処理を作っていかなければいけないわけですが、ログイン処理はどう実装すればいいのでしょうか?

ログイン処理の実装方法

web系のログイン処理ではセッション変数というものを使ってログイン状態の判断をします。

セッション変数とは簡単に言うと利用者のブラウザ側で保持され続ける変数みたいな感じです。

例えばログイン処理に成功したら、セッション変数Authenticationをtrueにして、それがtrueの間はログイン状態と見なすといった使い方ができます。

まずはログインの為のフォーム

今までの記事を見てきていただいた方ならわかると思いますが、まずはメールアドレスとパスワードを入力するフォーム画面を作りましょう。

フォーム自体はユーザー登録で使ったのとほぼ同一で使いまわせます。あとは入力された値と以下のクエリを合わせます。

※今まで作ってきたデータベースやテーブルの項目での例です。別途作成している場合は名前等を調整してください。

select * from users where mail = ? and password = ?;

ステートメントを使うと以下のような形です。

$stmt = $db->prepare("select * from users where mail = ? and password = ?");
$stmt->bind_param('ss', $email, $password);
$stmt->execute();

入力されたメールアドレスとパスワードと一致するレコードがあればログイン成功と判断するといった感じですね。

ユーザーの判定

ログインは成功したとして、そのユーザーが誰であるかも持続的に記録しておかなければ各処理で誰が行うものなのかがわかりません。

よくあるのはuser_idもセッション変数で持っておき、必要に応じてユーザー情報を参照するといったところですかね。

それらを合わせるとログイン処理は以下のような実装になります。

<?php
    session_start();
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_NAME', 'whateat');
    
    $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if ($db->connect_error){
        echo '接続失敗';
        exit;
    }
    $db->set_charset('utf8');

    $email = $_POST['email'];
    $password = $_POST['password'];
    
    if (!$email) {
        echo 'メールアドレスが入力されていません';
        exit;
    }
    if (!$password) {
        echo 'パスワードが入力されていません';
        exit;
    }
    
    $stmt = $db->prepare("select user_id from users where mail = ? and password = ?");
    $stmt->bind_param('ss', $email, $password);
    $stmt->execute();
    $stmt->store_result();
    
    if ($stmt->num_rows == 1) {
        $stmt->bind_result($user_id);
        $stmt->fetch();

        $_SESSION['authentication'] = true;
        $_SESSION['user_id'] = $user_id;
    }
    
    $stmt->close();
    $db->close();
?>

すごい不格好な継ぎ足しスタイルになっていて申し訳ないですが、session_start()は一番最初に書く必要があるので今までの例でいうheader.phpの先頭に加えるのが良いと思います。

入力されたメールアドレスとパスワードに一致するレコードをusersテーブルから取得して、該当があればログイン情報をセッションに格納する形です。

あとは試しに以下のような記述をした別ページで値が格納されているかを確認してみてください。

<?php
    echo $_SESSION['authentication'];
    echo $_SESSION['user_id'];
?>

値が入っていればOKです、別ページにまたがっても認証情報は維持されています。

まとめ

正直つっこみどころは万歳の内容なのであまり真剣に掘り下げる必要はないです。どのみちフレームワークを使ったらフレームワークの作法に乗っ取って認証も書くことになりますのでイチからになります。

まずは基本の動きがどうなっているかを最低限でいいので作ってみて理解していくと良いと思います。