セッション

■概要

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

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

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

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

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

			②.webページでサーバーでセッションを開始する

			③.ユーザーのクッキーの値をチェックする

			④.クッキーに値がない(初めての訪問)場合は
			  セッションIDを生成してクッキーに保存する

			⑤.webページ表示処理

			⑥.webページ終了時にサーバーに$_SESSIONの内容を保存する

		・2回目のアクセス
			①.ユーザーがサーバーにアクセスする

			②.webページでセッションを開始する

			③.クッキーからセッションIDを取得する

			④.セッションIDをもとにしてIDと関連付けられている
			  データをサーバーから取得し、$_SESSIONに反映する

			⑤.webページ表示処理

			⑥.webページ終了時に$_SESSIONの内容をサーバーに保存する

		$_SESSIONの内容をサーバーに保存するとありますが、
		これはPHPが用意しているデータベースに保存されます。

■使い方

セッションを使用するためには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変数は使用できません。

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

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

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

	上の例のphpを順番に実行するとsession_error_02.phpで
	「Notice: Undefined variable: _SESSION」というエラーが出ます。
	これは_SESSION変数が宣言されていないというメッセージです。
	次に「session_error_02.php」にsession_startを追加して実行してみます。

	・session_start追加したコード
		// session_error_02.php
		<?php
			session_start();
			echo $_SESSION["session_error"];
		?>

		出力結果:
			test

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

■削除

削除を行う場合、unsetまたはsession_destroyを使用します。

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

	・関数名
		unset
	
	・戻り値
		なし

	・引数
		第一引数
			削除するデータ

		第二引数
			オプションあり

	・内容
		引数で指定したデータの割り当てを解除します。
		※セッションのみならず他のデータでも使用可能です。

	・使用例
		// 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
	
	・戻り値
		bool
			成功 => true
			失敗 => false

	・引数
		なし

	・内容
		セッションIDに関連付けられているデータ($_SESSION)を
		全て破棄します。

	・使用例
		// 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の内容が破棄されたからです。