クッキーとセッション:サイト訪問者の情報を覚えておくための仕組み

2015年11月2日(月)
野田 貴子

はじめに

これから始めるPHP入門コラムでは、PHPを学ぶ人が、PHPで簡単なプログラムを書けるようになるまでに必要な知識とポイントをTips的に書いていきます。今後PHPのスキルを身につけて仕事に役立てたい、という方のために「PHP技術者認定初級試験」の出題範囲を意識しながら進めていきますので、ぜひ最後までお付き合いください。

今回のあらすじ

  • クッキー
  • セッション
  • ログイン・ログアウトの仕組みを作る

クッキー

Webの仕組みにはHTTPクッキー(Cookie)という技術があり、これを使うと次のようなことができます。

  1. 同じブラウザから何回アクセスされたか分かる
  2. 前回入力したユーザー名が分かる
  3. 前回のアクセス時にカートに入れた商品の一覧が分かる
  4. ログイン・ログアウトの仕組みを作れる

クッキーとは、Webブラウザに文字列データを保存したり、保存したデータを取得したりする機能です。例えば上記の「同じブラウザから何回アクセスされたか分かる」を実現するためには、ブラウザからアクセスがあるたびに、現在のアクセス数に+1してクッキーに保存しておきます。

図1:クッキー情報は、Webブラウザ側に保存される

図1:クッキー情報は、Webブラウザ側に保存される

クッキーを保存する

PHPは、このクッキーを完全にサポートしています。クッキーを保存するためには、setcookie関数を使用します。

setcookie

http://php.net/manual/ja/function.setcookie.php

<?
// クッキーを保存する
// 名前:access_count
// データ:0
setcookie("access_count", 0);
?>

クッキーを取得する

保存したクッキーは、$_COOKIEというグローバル変数を使って取得することができます。

<?php
// クッキーを取得する
// 名前:access_count
$count = $_COOKIE["access_count"] + 1;

echo $count . "回目のアクセスありがとうございます。";

// クッキーを保存する
// 名前:access_count
// データ:現在値+1
setcookie("access_count", $count + 1);
?>

クッキーの有効期限を設定する

クッキーは、いつまで保存されるのでしょうか。デフォルトでは、ブラウザを閉じたときに破棄されます。クッキーが破棄される時間(Unixタイムスタンプ)を指定したい場合は、setcookieに引数を追加します。

<?php
// クッキーの有効期限を1時間(3600秒)後に設定する
setcookie("testData", "TEST", time() + 3600);
// クッキーの有効期限を30日後に設定する
setcookie("testData", "TEST", time() + time() + 60 * 60 * 24 * 30);
?>

クッキーを削除する

クッキーを削除するには、以下の方法があります。

  • クッキーのデータを空文字にする
  • クッキーのデータをfalseにする
  • クッキーの有効期限を過去にする
<?php
// クッキーを設定する
setcookie("testData", "TEST");
// クッキーを削除する(A)
setcookie("testData", "");
// クッキーを削除する(B)
setcookie("testData", false);
// クッキーを削除する(C)
setcookie("testData", "TEST", time() - 3600);
?>

クッキーを使用する際の注意

クッキーはHTTPヘッダの一部なので、setcookie()はブラウザに何らかの出力を行う前に呼び出す必要があります。この制約は、header()と同じです。

セッション

セッションは、ログイン情報を保持するためによく使用されます(方法は後述)。PHPのセッションは、PHPSESSIDという名前のクッキーを使用します。PHPSESSIDにIDが保存されていれば、PHPはそのセッションIDを自動的にWebサーバ上のファイル、またはデータベースに保存されているデータと関連付けます(図2)。

図2:PHPでは特別な名前のクッキーを用いて、セッションを実現している

図2:PHPでは特別な名前のクッキーを用いて、セッションを実現している

プログラムを書く上でPHPSESSIDの扱いを気にする必要はありません。Webサーバ上で管理されるセッションデータは、$_SESSIONというグローバル変数を使って管理することができます。

セッションデータを保存する

セッションを使用するためには、スクリプトの最初でsession_start関数を呼ぶ必要があります。session_start関数を呼ぶと、ブラウザのPHPSESSIDとWebサーバのセッションデータを使うための準備がされます。

session_start

http://php.net/manual/ja/function.session-start.php

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

// 入力されたユーザー名を保存する
$_SESSION["user_name"] = $_POST["user_name"];

echo "こんにちは、" . $_SESSION["user_name"] . "さん。";
?>

セッションデータを取得する

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

// 保存されたセッションデータを取得する
$user_name = $_SESSION["user_name"];

if ($user_name != "") {
echo "こんにちは、" . $user_name . "さん。";
}
else {
echo "ユーザー名を入力してください。";
}
?>

セッションデータを削除する

$_SESSION配列から、unset関数を使って削除したいデータを破棄します。

unset

http://php.net/manual/ja/function.unset.php

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

// 保存されたセッションデータを削除する
unset($_SESSION["user_name"]);
?>

ログイン・ログアウトの仕組みを作る

ログイン

ログインしているかどうかは、セッションデータに既定のデータが存在するかどうかで判断します。多くの場合、ユーザーIDが存在するかどうかでチェックします。

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

$loginId = $_POST["login_id"]; // フォームに入力されたログインID
$loginPw = $_POST["login_pw"]; // フォームに入力されたログインパスワード

// ログインチェック(checkLogin関数の実装は省略)
// 成功するとユーザー情報が配列で返ってくるものとします
$user_data = checkLogin ($loginId, $loginPw);

// 入力されたIDとパスワードに一致するユーザーが存在する場合
If ($user_data! == False) {
    // セッションにユーザーIDを保存しておく
    $_SESSION ["user_id"] = $user_data ["user_id"];
}

// ログイン中?(セッションにユーザーIDがある?)
if (array_key_exists("user_id", $_SESSION)) {
    echo "ログインできました。ようこそ。";
}
// ログアウト中?(セッションにユーザーIDがない?)
else {
    echo "ログインしてください。";
}
?>

ログアウト

ログインしているかどうかは、セッションデータに既定のデータが存在するかどうかで判断しました。ログアウトはこの反対で、既定のデータをセッションから削除することで実装できます。

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

// ログイン中?(セッションにユーザーIDがある?)
if (array_key_exists("user_id", $_SESSION)) {
    // ログアウト(セッションデータを削除)する
    unset($_SESSION["user_id"]);
}
?>

おわりに

いかがでしたか。PHPのフレームワークを使えば、ログイン・ログアウトの機能が最初から用意されている場合もありますが、ぜひ仕組みを理解して、自分でも作れるようになってみましょう。そして実際に作ったアプリケーションを公開して、フィードバックを得てみるとおもしろいと思います。それではよいPHPライフを!

1983年生まれ。大学卒業後、ソフトウェア開発の営業を経て、ソフトウェア開発業務に転向。現在は自社パッケージのフロントエンド開発のほか、PHPでの受託開発案件、日→英のローカライズ案件などを担当。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています