今回はPHPでセッションを扱っていきます。前回の記事ではCookieに小さいデータを保存して異なるページ間でデータをやり取りしてみました。 Cookieでは小さなデータのみ保存できましたが、セッションを利用することで様々なデータを扱うことができます。

PHPでのセッションの利用

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年09月28日

今回はPHPでセッションを扱っていきます。前回の記事ではCookieに小さいデータを保存して異なるページ間でデータをやり取りしてみました。

Cookieでは小さなデータのみ保存できましたが、セッションを利用することで様々なデータを扱うことができます。

セッションの開始

セッションはサーバー上に保存されます。まずはセッションを開始して、サーバー上に保存する準備をします。書式は以下の通りです。

<?php
session_start() : bool

session_start()と呼び出すと、セッションが開始または既存のセッションの読み込みができます。返り値はtrueまたはfalseで、セッションが正常に開始されたかどうかをチェックできます。

また、session_start()もCookieと同様に、これよりも前にHTMLやPHPコード以外の空白などがない状態で実行しましょう。

セッション変数の利用

セッションの開始session_start()で、適切にセッションが作成されたあとは、セッション変数を自由に扱うことができます。セッション変数は以下のスーパーグローバル変数として代入・利用することができます。

<?php
$_SESSION

この$_SESSION変数は、連想配列形式です。任意のキー名でセッションにデータを追加・利用できます。

セッションの破棄

使い終わったセッションは破棄しましょう。基本的にセッションは時間経過で自動的に破棄されますが、セキュリティ上の安全のために、任意のタイミングで破棄することができます。

<?php
session_destroy()

session_destroy()の実行も、これよりも前にHTMLやPHPコード以外の空白があってはいけません。

また、確実にセッション情報を破棄するには、以下のようにセッションに紐づくCookie情報も消してしまうのが安全です。

<?php
$_SESSION = array();
if(isset($_COOKIE[session_name()])) {
	$params = session_get_cookie_params();
	setcookie(session_name(), '', 1,
		$params["path"], $params["domain"],
		$params["secure"], $params["httponly"]
	);
}
session_destroy();

このコードを関数化しておくと便利かと思います。

セッション変数へデータの追加

実際にセッションの開始、セッション変数へのデータの追加までをやってみましょう。

せっかくなので少し実用的に、POSTでデータを送信しそのデータをセッション変数に保存します。

まずはデータを送信するフォームを作成します。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>POSTデータでセッションテスト</title>
</head>
<body>
	<form action="session-store.php" method="POST">
		<ul>
			<li><label>お名前:<input type="text" name="name"></label></li>
			<li><label>年齢:<input type="number" name="age"></label></li>
			<li>
				<label>性別:
					<select name="gender">
						<option value="">---</option>
						<option value="man">男性</option>
						<option value="woman">女性</option>
						<option value="other">その他</option>
					</select>
				</label>
			</li>
		</ul>
		<label><button type="submit">送信</button></label>
	</form>
</body>
</html>

名前・年齢・性別を入力するフォームを作成しました。

このフォームの送信先である、セッション保存用PHPファイルを作成します。(session-store.php)

<?php
session_start();

// 3回も似たようなコードができたので、session_store関数を作成して改修しやすく変更
// if(isset($_POST['name']) && !empty($_POST['name'])) {
// 	$_SESSION['name'] = $_POST['name'];
// }
//
// if(isset($_POST['age']) && !empty($_POST['age'])) {
// 	$_SESSION['age'] = $_POST['age'];
// }
//
// if(isset($_POST['gender']) && !empty($_POST['gender'])) {
// 	$_SESSION['gender'] = $_POST['gender'];
// }

function session_store($key) {
	if(isset($_POST[$key]) && !empty($_POST[$key])) {
		$_SESSION[$key] = $_POST[$key];
	}
}

session_store('name');
session_store('age');
session_store('gender');

// エラーメッセージ格納用配列を宣言
$error_message = array();

if(empty($_POST['name'])) {
	array_push($error_message, 'お名前が入力されていません!');
}
if(empty($_POST['age'])) {
	array_push($error_message, '年齢が入力されていません!');
}
if(empty($_POST['gender'])) {
	array_push($error_message, '性別が選択されていません!');
}
?>

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>セッション保存テスト</title>
</head>
<body>
	<?php
	// 1つでもエラーがあった場合
	if(count($error_message) > 0) {
		foreach ($error_message as $value) {
			echo '<span style="color:red;">' . $value .'</span><br>';
		}
		echo '<a href="session-question.html">戻る</a>';
	} else {
		echo '<span>セッションに入力値を格納しました!</span><br>';
		echo '<a href="session-check.php">セッション情報を確認</a>';
	}
	?>
</body>
</html>

順番に解説します。

  • session_start(): まずはセッションの開始です。これよりも上にHTMLやPHPコード以外の空白がないように気をつけましょう。
  • function session_store($key): セッション変数に保存する専用の関数を作成しました。この関数を呼び出すとPOSTデータがセットされているかをチェックし、セットされていればセッション変数にデータを格納します。引数の$keyでどの値を保存するか決めることができます。
  • session_store('name'): 作成した関数を利用して、実際にPOSTされた3つのデータをセッション変数に格納していきます。
  • if(empty($_POST['name']): セッション変数に格納されたデータが空かどうかをチェックします。空だった場合には$error_messageの配列にエラーメッセージの文字列データを追加します。empty関数を利用すると引数に渡したデータが空かどうかを見て、空であればTRUEを返します
  • if(count($error_message) > 0): エラーメッセージの数をカウントすれば、実際にエラーがあったかどうかがわかります。count関数の引数にデータの個数を確認したい配列データを入れると、データの個数が返り値として返却されるため、これが0より多ければ、エラーメッセージを表示します。
    エラーの数が0個であれば、セッション変数にすべてのデータを格納したことをメッセージで表示します。

実行結果

まずはHTMLの表示とセッション保存までの実行結果を見ていきます。

フォームはこのように表示されます。

フォームに空のデータが入っていた場合のエラーメッセージです。

入力値に空のデータがなく、セッション変数に適切に保存ができた場合の画面です。

あとは保存したセッションのデータを取り出して表示してみましょう。

セッション変数からデータの取り出し

保存されたセッション情報を確認するPHPファイルを作成しましょう。session-check.php

<?php
session_start();

// セッション破棄関数
function kill_session() {
	$_SESSION = array();
	if(isset($_COOKIE[session_name()])) {
		$params = session_get_cookie_params();
		setcookie(session_name(), '', 1,
			$params["path"], $params["domain"],
			$params["secure"], $params["httponly"]
		);
	}
	session_destroy();
}

$name = $_SESSION['name'];
$age = $_SESSION['age'];

if($_SESSION['gender'] === 'man') {
	$gender = '男';
} else if($_SESSION['gender'] === 'woman') {
	$gender = '女';
} else if($_SESSION['gender'] === 'other') {
	$gender = 'その他';
} else {
	$gender = '';
}

// 使い終わったらセッションを破棄
kill_session();
?>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>セッション確認テスト</title>
</head>
<body>
	<ul>
	<?php
		function es($string) {
			return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
		}
		if(!empty($name) && !empty($age) && !empty($gender)) {
			echo '<li>お名前:' . es($name) . '</li>';
			echo '<li>年齢:' . es($age) . '</li>';
			echo '<li>性別:' . es($gender) . '</li>';
		} else {
			echo '<span style="color:red;">セッション情報がありません。。</span><br>';
			echo '<a href="session-question.html">入力画面へ戻る</a>';
		}
	?>
	</ul>
</body>
</html>

一つずつ解説します。

  • session_start(): セッション変数を利用するため、セッションの開始を宣言します。既存のセッションがある場合にはそれを利用します。
  • function kill_session(): セッションを完全に削除するために、セッション変数を空にし、セッション情報に紐づくCookieも削除する関数を作成しました。もちろんこの関数が呼び出されるまではセッションは破棄されません。
  • セッション変数の利用: セッション変数に格納されているデータを新たに宣言した変数にそれぞれ代入しています。性別情報に関しては日本語で表示したいため、データを検証し、適切な日本語文字列を変数に格納しています。
  • function es($string): HTMLエスケープを実行する関数を作成しておきます。このように宣言しておけばes(エスケープしたい文字列)と呼び出すだけでHTMLエスケープを実行し、返り値として変換後の文字列を受け取ることができます。
  • if(!empty($name) && !empty($age) && !empty($gender)): それぞれの変数がすべて空でないことを確認します。1つでも空の変数があればelseに処理が分岐し、入力画面へ戻るリンクが表示されます。

セッションの開始・破棄・セッション変数の利用以外は基本技術の組み合わせです。kill_session関数に関しては使ったことのない定義済み関数を利用していますが、当記事の理解が追いついていれば、インターネットで調べれば十分にわかるかと思います。関数名からもある程度予測は可能ですね。

また、セッション変数に保存する際にも、POSTデータをそのまま保存しているので、表示する際にはHTMLエスケープを忘れないように気をつけましょう。

まとめ

セッションの利用をPHPで行っていきました。以下の点をきちんと理解しておきましょう。

  • session_start()でセッションを開始する。この関数の呼び出し前にPHPコード以外の空白やHTMLが入っていないようにすること
  • セッション開始後は$_SESSIONというスーパーグローバル変数を利用して好きなようにデータを格納できる
  • セッション変数を利用することにより、ページをまたいでデータのやり取りが可能になる。この技術を利用してログイン機能なども実現可能

タグ