ゼロから始めるPHP講座 Vol.48 セッションの使用例



ゼロから始めるPHP講座 Vol.48 セッションの使用例
目次
  1. ゼロから始めるPHP講座セッションの使用例
  2. セッション使用例
  3. 課題

ゼロから始めるPHP講座セッションの使用例

セッション使用例

ユーザ認証の仕組みにセッションは利用されます。

/htdocs/session_sample_top.php*ログインページ*


<?php
/*
*  ログインページ
*
*  セッションの仕組み理解を優先しているため、一部処理はModelへ分離していません
*  また処理はセッション関連の最低限のみ行っており、本来必要な処理も省略しています
*/

require_once '../include/conf/const.php';
require_once '../include/model/function.php';

// セッション開始
session_start();

// セッション変数からログイン済みか確認
if (isset($_SESSION['user_id']) === TRUE) {
    // ログイン済みの場合、ホームページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_home.php');
    exit;
}

// セッション変数からログインエラーフラグを確認
if (isset($_SESSION['login_err_flag']) === TRUE) {

    // ログインエラーフラグ取得
    $login_err_flag = $_SESSION['login_err_flag'];
    // エラー表示は1度だけのため、フラグをFALSEへ変更
    $_SESSION['login_err_flag'] = FALSE;

} else {
    // セッション変数が存在しなければエラーフラグはFALSE
    $login_err_flag = FALSE;
}

// Cookie情報からメールアドレスを取得
if (isset($_COOKIE['email']) === TRUE) {
    $email = $_COOKIE['email'];
} else {
    $email = '';
}

// 特殊文字をHTMLエンティティに変換
$email = entity_str($email);

include_once '../include/view/session_sample_top.php';


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ログイン</title>
    <style>
        input {
            display: block;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <form action="session_sample_login.php" method="post">
        <label for="email">メールアドレス</label>
        <input type="text" id="email" name="email" value="<?php print $email; ?>">
        <label for="passwd">パスワード</label>
        <input type="password" id="passwd" name="passwd" value="">
        <input type="submit" value="ログイン">
    </form>
<?php if ($login_err_flag === TRUE) { ?>
    <p>メールアドレス又はパスワードが違います</p>
<?php } ?>
</body>
</html>

/htdocs/session_sample_login.php*ログイン処理*


<?php
/*
*  ログイン処理
*
*  セッションの仕組み理解を優先しているため、一部処理はModelへ分離していません
*  また処理はセッション関連の最低限のみ行っており、本来必要な処理も省略しています
*/

require_once '../include/conf/const.php';
require_once '../include/model/function.php';

// リクエストメソッド確認
if (get_request_method() !== 'POST') {
    // POSTでなければログインページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_top.php');
    exit;
}

// セッション開始
session_start();

// POST値取得
$email  = get_post_data('email');  // メールアドレス
$passwd = get_post_data('passwd'); // パスワード

// メールアドレスをCookieへ保存
setcookie('email', $email, time() + 60 * 60 * 24 * 365);

// データベース接続
$link = get_db_connect();

// メールアドレスとパスワードからuser_idを取得するSQL
$sql = 'SELECT user_id FROM user_table
        WHERE email =\'' . $email . '\' AND passwd =\'' . $passwd . '\'';

// SQL実行し登録データを配列で取得
$data = get_as_array($link, $sql);

// データベース切断
close_db_connect($link);

// 登録データを取得できたか確認
if (isset($data[0]['user_id'])) {

    // セッション変数にuser_idを保存
    $_SESSION['user_id'] = $data[0]['user_id'];
    // ログイン済みユーザのホームページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_home.php');
    exit;

} else {

    // セッション変数にログインのエラーフラグを保存
    $_SESSION['login_err_flag'] = TRUE;
    // ログインページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_top.php');
    exit;

}

/htdocs/session_sample_home.php*ログイン済みユーザのホームページ*


<?php
/*
*  ログイン済みユーザのホームページ
*
*  セッションの仕組み理解を優先しているため、一部処理はModelへ分離していません
*  また処理はセッション関連の最低限のみ行っており、本来必要な処理も省略しています
*/

require_once '../include/conf/const.php';
require_once '../include/model/function.php';

// セッション開始
session_start();

// セッション変数からuser_id取得
if (isset($_SESSION['user_id']) === TRUE) {
    $user_id = $_SESSION['user_id'];
} else {
    // 非ログインの場合、ログインページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_top.php');
    exit;
}

// データベース接続
$link = get_db_connect();

// user_idからユーザ名を取得するSQL
$sql = 'SELECT user_name FROM user_table WHERE user_id = ' . $user_id;

// SQL実行し登録データを配列で取得
$data = get_as_array($link, $sql);

// データベース切断
close_db_connect($link);

// ユーザ名を取得できたか確認
if (isset($data[0]['user_name'])) {
    $user_name = $data[0]['user_name'];
} else {
    // ユーザ名が取得できない場合、ログアウト処理へリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_logout.php');
    exit;
}

// ログイン済みユーザのホームページ表示
include_once '../include/view/session_sample_home.php';


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ホーム</title>
</head>
<body>
    <p>ようこそ<?php print $user_name; ?>さん</p>
    <form action="session_sample_logout.php" method="post">
        <input type="submit" value="ログアウト">
    </form>
</body>
</html>

/htdocs/session_sample_logout.php*ログアウト済みユーザのホームページ*


<?php
/*
*  ログアウト処理
*
*  セッションの仕組み理解を優先しているため、一部処理はModelへ分離していません
*  また処理はセッション関連の最低限のみ行っており、本来必要な処理も省略しています
*/

require_once '../include/conf/const.php';
require_once '../include/model/function.php';

// セッション開始
session_start();

// セッション名取得 ※デフォルトはPHPSESSID
$session_name = session_name();

// セッション変数を全て削除
$_SESSION = array();

// ユーザのCookieに保存されているセッションIDを削除
if (isset($_COOKIE[$session_name])) {
    setcookie($session_name, '', time() - 42000);
}

// セッションIDを無効化
session_destroy();

// ログアウトの処理が完了したらログインページへリダイレクト
header('Location: http://codecamp.lesson.codecamp.jp/session_sample_top.php');
exit;

データベーステーブル(user_table)user_table.sql

php-cookies-sample6-639

メールアドレスとパスワードを入力し、データベースに登録されている情報と一致した場合、ログインが完了しユーザ名が表示されます。php-cookies-sample7-639

php-cookies-sample8-639

セッション変数で管理しているのは、以下2つです。

$_SESSION[‘user_id’]$_SESSION[‘login_err_flag’]

$_SESSION[‘user_id’]はユーザを識別するuser_idを保存しています。

ログイン処理にて、メールアドレスとパスワードがデータベースに登録されている情報と一致した場合にセッション変数へ保存しています。


// 登録データを取得できたか確認
if (isset($data[0]['user_id'])) {

    // セッション変数にuser_idを保存
    $_SESSION['user_id'] = $data[0]['user_id'];
    // ログイン済みユーザのホームページへリダイレクト
    header('Location: http://codecamp.lesson.codecamp.jp/session_sample_home.php');
    exit;

以前ひとこと掲示板のサンプルでも利用していましたが、header関数を利用することで、指定URLへリダイレクトできます。

$_SESSION[‘user_id’]は、各ページにアクセスしたユーザがログイン済みかどうか判断するのに利用しています。


// セッション変数からログイン済みか確認
if (isset($_SESSION['user_id']) === TRUE) {
// ログイン済みの場合、ホームページへリダイレクト
header('Location: http://codecamp.lesson.codecamp.jp/session_sample_home.php');
exit;
}

セッションIDから「同じユーザからのアクセス」であることの判断はできますが、「どのユーザからのアクセス」かまでは確認できません。

このような場合、セッション変数にユーザを特定する情報を保持すること特定できます。

なお今回はWebページ数が必要最低限になっていますが、ログイン済みのユーザしか閲覧できないページ全てこのようにログイン状態の確認を行います。

$_SESSION[‘login_err_flag’]はメールアドレスとパスワードによるユーザ認証が成功したか否かを確認するためのフラグです。


// セッション変数からログインエラーフラグを確認
if (isset($_SESSION['login_err_flag']) === TRUE) {

    // ログインエラーフラグ取得
    $login_err_flag = $_SESSION['login_err_flag'];
    // エラー表示は1度だけのため、フラグをFALSEへ変更
    $_SESSION['login_err_flag'] = FALSE;

} else {
    // セッション変数が存在しなければエラーフラグはFALSE
    $login_err_flag = FALSE;
}


<?php if ($login_err_flag === TRUE) { ?>
    <p>メールアドレス又はパスワードが違います</p>
<?php } ?>

認証に失敗して値がTRUEとなっていた場合、Viewにてエラーメッセージを表示しています。

このように一時的に利用する情報の管理にもセッション変数は利用できます。


// セッション開始
session_start();

// セッション名取得 ※デフォルトはPHPSESSID
$session_name = session_name();

// セッション変数を全て削除
$_SESSION = array();

// ユーザのCookieに保存されているセッションIDを削除
if (isset($_COOKIE[$session_name])) {
    setcookie($session_name, '', time() - 42000);
}

// セッションIDを無効化
session_destroy();

ログアウトの際、session_sample_logout.phpでは以下3つの処理を行っています。

  • 空の配列を代入することでセッション変数を削除(19行目)- ユーザのCookieに保存されているセッションIDを削除(2224行目)- サーバに保存されているセッションIDを無効化(27行目)

セッション破棄する場合、セッションの仕組みに利用している情報全てを削除します。

課題

「現在日時」「前回アクセスした日時」「これまでアクセスした回数」を表示するプログラムを作成してください。またアクセス履歴の削除ボタンを作成してください。

プログラムはCookie利用したものとセッション利用したもの、2つを作成してください。

ファイルが複数になる場合、指定のファイル名と関連した名前をつけてください。php-cookies-sample9-639

php-cookies-sample10-639

PREVLESSONセッションとはセッションとは

CodeCampus編集部
この記事を書いた人
CodeCampus編集部
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp