セッション

概要

セッションとはサーバーにデータ保存することができる機能です。

特性

セッションには以下の特性があります。

機密性が高い

セッションはサーバー側にデータを保存するので安易にデータの中身を
確認することや変更することができません。
なので、パスワードのなどの機密性の高いデータや変更されたくないデータに適しています。

ブラウザが変わると無効

次の項目で説明しますが、セッションは各ブラウザのクッキーと
結びついているため、ブラウザが異なるとセッションは無効となります。

保存サイズの制限がない

セッションに保存するデータのサイズに制限はありません。
ただ、サーバー側の容量を圧縮することになるので、
大きすぎるデータの保存には注意が必要です。

セッションの仕組み

セッションはクッキーにユニークIDを設定しており、
クッキーはサーバーにアクセスする際にそのIDを通知しています。
これによって、セッションは誰からアクセスされたかを把握できるようになり、
その結果該当するデータを$_SESSIONに反映できています。

セッションの流れ

セッションは1回目のアクセスと2回目以降のアクセスでは流れが異なります。

1回目のアクセス
順番 内容
ユーザーがサーバーにアクセスする
サーバーでセッションを開始する
ユーザーのクッキーの値をチェックする
クッキーに値がない(初めての訪問)場合は
セッションIDを生成してクッキーに保存する
webページ表示処理
webページ終了時にサーバーに$_SESSIONの内容を保存する
2回目のアクセス
順番 内容
ユーザーがサーバーにアクセスする
クッキーからセッションIDを取得する
セッションIDをもとにしてIDと関連付けられているデータを
サーバーから取得し、$_SESSIONに反映する
webページ表示処理
webページ終了時に$_SESSIONの内容をサーバーに保存する

使い方

セッションを使用するためにはsession_startを使用します。

session_start関数
関数内容 セッションを開始します。
この関数を使用していない場合、$_SESSIONは通常の変数扱いになるので、
次の起動まで値が保存されていることはありません。
※オプション引数が多数ありますが、多すぎるので省略しています。

使用例

以下のようにセッションはサーバー側で保存されるので
php間の値渡しで使用したり、ユーザーの訪問をカウントしたりできます。

// php間の値渡し
// StartSession.php
<?php
	session_start();

	$_SESSION["user_name"] = "山田太郎";
?>

// SessionCheck.php
<?php
	session_start();

	echo $_SESSION["user_name"];
?>


// 訪問回数カウント
// Visit.php
<?php
	session_start();

	if (isset($_SESSION["visit"]) == false)
	{
		$_SESSION["visit"] = 0;
	}
	$_SESSION["visit"] += 1;

	echo "あなたが訪れた回数" . $_SESSION["visit"];
?>

注意点

session_startを使用していない場合、$_SESSION変数は使用できません。

以下の例のphpを順番に実行するとsession_error_02.phpで
「Notice: Undefined variable: _SESSION」というエラーが出ます。
これはセッションが開始されていないので$_SESSION変数が
宣言されていないというエラーメッセージです。

// session_error_01.php
<?php
	session_start();

	$_SESSION["session_error"] = "test";
?>

// session_error_02.php
<?php
	echo $_SESSION["session_error"];
?>


「session_error_02.php」にsession_startを追加して実行してみます。


// session_error_02.php
<?php
	session_start();
	echo $_SESSION["session_error"];
?>


session_startを追加した結果、「session_error_01.php」で設定した
「test」という文字が無事表示されました。
このようにsession_startを使用しないと$_SESSION変数が
機能しなくなるので注意して下さい。

削除

セッションの削除を行う場合、unsetまたはsession_destroyを使用します。

unset

unsetは引数に削除したいセッションデータを指定することで
指定したデータのみを削除する関数です。

unset関数
関数内容 引数で指定したデータの割り当てを解除します。
※1.第2引き数以降も破棄する変数を指定できます。
※2.セッションのみならず他のデータでも使用可能です。
引数 説明
第1引数 破棄する変数
第2引数以降 別の破棄予定の変数

使用例

// unset_check_01.php
<?php
	session_start();

	$_SESSION["user_name"]  = "test";

	unset($_SESSION["user_name"]);

	// unset_check_02.phpにリダイレクト
	header("Location: unset_check_02.php");
?>

// unset_check_02.php
<?php
	session_start();

	echo $_SESSION["user_name"];
?>


unset_check_01.phpを実行するとリダイレクトされた
unset_check_02.php内でUndefineエラーが発生しますが
これはunsetにて$_SESSION["user_name"]を削除したので
unset_check_02.phpで$_SESSION["user_name"]は
存在しないために発生しています。

session_destroy

session_destroyを使用した場合セッションIDに
関連付けられているデータすべてを破棄します。

session_destroy関数
関数内容 セッションIDに関連付けられているデータ($_SESSION)を
全て破棄します。
戻り値 削除結果 成功(true)

使用例

// session_destroy_check_01.php
<?php
	session_start();

	$_SESSION["user_name"]  = "test";

	session_destroy();

	// session_destroy_check_02.phpにリダイレクト
	header("Location: session_destroy_check_02.php");
?>

// session_destroy_check_02.php
<?php
	session_start();

	echo $_SESSION["user_name"];
?>


こちらもunsetと同じようにsession_destroy_check_01.phpを実行後
リダイレクトされた先のsession_destroy_check_02.phpでundefineエラーが発生します。
session_destroyで、$_SESSIONの内容が破棄されたからです。