クッキーとセッション:サイト訪問者の情報を覚えておくための仕組み
はじめに
これから始めるPHP入門コラムでは、PHPを学ぶ人が、PHPで簡単なプログラムを書けるようになるまでに必要な知識とポイントをTips的に書いていきます。今後PHPのスキルを身につけて仕事に役立てたい、という方のために「PHP技術者認定初級試験」の出題範囲を意識しながら進めていきますので、ぜひ最後までお付き合いください。
今回のあらすじ
- クッキー
- セッション
- ログイン・ログアウトの仕組みを作る
クッキー
Webの仕組みにはHTTPクッキー(Cookie)という技術があり、これを使うと次のようなことができます。
- 同じブラウザから何回アクセスされたか分かる
- 前回入力したユーザー名が分かる
- 前回のアクセス時にカートに入れた商品の一覧が分かる
- ログイン・ログアウトの仕組みを作れる
クッキーとは、Webブラウザに文字列データを保存したり、保存したデータを取得したりする機能です。例えば上記の「同じブラウザから何回アクセスされたか分かる」を実現するためには、ブラウザからアクセスがあるたびに、現在のアクセス数に+1してクッキーに保存しておきます。
クッキーを保存する
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)。
プログラムを書く上で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ライフを!