セッションに情報を保存しよう – session_start / $_SESSION

ウェブは、ページを移るとそれまでの情報はすべて消えてしまいます。これを「セッションが切れる」と言います。そのため、ページ間で情報を共有したい場合はセッションに情報を保存しておく必要があります。次のようなHTMLを準備しましょう。

<?php
$account = 'tomosta';
?>
...
<p>ようこそ、<?php echo htmlspecialchars($account, ENT_QUOTES | ENT_HTML5); ?>さん</p>
<p><a href="page02.php">次のページへ</a></p>
...

そして、page02.phpを準備しましょう。

<p><?php echo htmlspecialchars($account, ENT_QUOTES | ENT_HTML5); ?>さん</p>

こうしてページを表示すると、アカウント名が画面に表示されますが、次のページに移動すると名前は消えてしまいます。「$account」という変数はページ間で共有できないためです。そこで、セッション変数に保存しましょう。

セッションをスタートする

セッション変数に値を保存するには、最初にセッションをスタートする必要があります。index.phpの先頭に、次のように追記しましょう。

<?php
session_start();
session_regenerate_id();
$account = 'tomosta';
?>
...

この時、ブラウザーの開発者ツールを起動して「アプリケーション→クッキー」を確認すると、セッションIDと呼ばれる特別なIDが記録されます。このセッションIDを利用して、セッションが保存できるようになります。

このセッションIDは使いまわしてしまうと非常に危険なため、ここでは「session_regenerate_id()」というファンクションを使って、再作成します。ページを再読み込みすると、その都度IDが変わっていることが確認できます。

セッション変数に保存する

セッション変数は「$_SESSION」というグローバル変数に連想配列として保存します。次のように追記しましょう。

<?php
session_start();
$account = 'tomosta';
$_SESSION['account'] = $account;
?>
...

これで保存され、ブラウザーを閉じるまでの間はページを移動しても内容が保存されるようになりました。

セッション変数を利用する

セッション変数を利用するには、同じくセッションをスタートした後、グローバル変数から値を取得します。page02.phpに次のように追記しましょう。

<?php
session_start();
$account = $_SESSION['account'];
?>
...
<p><?php echo htmlspecialchars($account, ENT_QUOTES | ENT_HTML5); ?>さん</p>

セッション変数を削除する

セッション変数は一部を削除したい場合は、内容を空文字などで上書きすれば良いでしょう。

$_SESSION['account'] = '';

セッション全体を削除する場合は空の配列を代入します。

$_SESSION = [];

ただしこれだけでは、セッションに利用したCookieが残ってしまうため、セキュリティ的なリスクがあります。そのため、このCookieも削除していきます。

if (ini_get('session.use_cookies')) {
  $params = session_get_cookie_params();
  setcookie(session_name(), '', time() - 42000,
    $params['path'], $params['domain'],
    $params['secure'], $params['httponly']
  );
}

少し複雑に見えますが、実際にやっているのは setcookieを使って Cookieに空文字を代入しているだけです。汎用的に使えるように、各種設定を取得するように作られているため、このプログラムをコピーして常に使うようにしても良いでしょう。PHPの公式ドキュメントにも記載があります。

最後に「session_destroy()」を使って、セッションを破棄します。

session_destroy();

これでセッションを破棄することができました。

完成プログラム

index.php

<?php
session_start();
session_regenerate_id();
$account = 'tomosta';
$_SESSION['account'] = $account;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>ようこそ、<?php echo htmlspecialchars($account, ENT_QUOTES | ENT_HTML5); ?>さん</p>    
    <p><a href="page02.php">次のページへ</a></p>
</body>
</html>

page02.php

<?php
session_start();

if (isset($_SESSION['account'])) {
    $account = $_SESSION['account'];
} else {
    $account = '';
}

$_SESSION = [];
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}
session_destroy();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p><?php echo htmlspecialchars($account, ENT_QUOTES | ENT_HTML5); ?>さん</p>
</body>
</html>

ともすたチャンネルに
チャンネル登録する