@ PHP

session:セッション

HTTP プロトコルでは、1 回の要求と応答が1組の通信になります。これらの通信は独立したやり取りで、過去に行った通信との関連はありません。このユーザが行う一連の通信のことをセッションといいます。

しかし、例えばログインをするようなシステムでは、そのシステムへ接続してくる HTTP アクセスのそれぞれにログイン中であることを認識させなければなりません。HTTP というプロトコルの仕組みだけではこのようなことはできません。

そこでセッションを使うと、Webブラウザから実行される複数の HTTP アクセスと、ログイン中のユーザーとを関連付けることができるようになります。この関連付けには、クッキー(PHPSESSIDというクッキー)を利用します。クッキーにセッション ID と呼ぶ識別情報を保存することで実現するのです。

情報の格納と取得

ページでセッションを使うためには、スクリプトの最初で session_start() をよびだします。setcookie() と同じように、この関数はあらゆる出力よりも前にこの関数をコールするようにしなければなりません。

$_SESSIONで変数を登録する

session_01A.php

<?php session_start(); ?>
<?php
if (empty($_SESSION['count'])) {
    $_SESSION['count'] = 1;
} else {
    $_SESSION['count']++;
}
?>
<!DOCTYPE html>
<html lang="ja">

<body>
  <p>こんにちは、あなたがこのページに来たのは <php echo $_SESSION['count']; ?> 回目ですね。</p>
  <p>続けるには、<a href="session_01B.php?<?php echo htmlspecialchars(SID); ?>">ここをクリック</a>してください。</p>
</body>

</html>

session_01B.php

<?php session_start(); ?>
<?php
if (empty($_SESSION['count'])) {
    $_SESSION['count'] = 1;
} else {
    $_SESSION['count']++;
}
?>
<!DOCTYPE html>
<html lang="ja">

<body>
  <p>こんにちは、あなたがこのページに来たのは <?php echo $_SESSION['count']; ?> 回目ですね。</p>
  <p>続けるには、<a href="session_01A.php?<?php echo htmlspecialchars(SID); ?>">ここをクリック</a>
してください。</p>
</body>

</html>

セッションの終了

全てのセッション変数を削除するためには空の配列を「$_SESSION」変数に格納します。

$_SESSION = array();

クライアント側にはクッキーで保存されていますのでクッキーを削除します。

if (isset($_COOKIE["PHPSESSID"])) {
    setcookie("PHPSESSID", '', time() - 1800, '/');
}

session_destroy() でサーバ側でセッション ID を破棄する。

session_destroy() は現在のセッションに関連づけられたすべてのデータを破棄します。この関数は、 セッションに関するグローバル変数を破棄しません。 また、セッションクッキーを破棄しません。

session_destroy();

session_02A.php

<?php session_start(); ?>
<?php
error_reporting(E_WARNING);
if (isset($_POST['destroy'])) {
    if ($_POST['destroy'] == "end") {
        $_SESSION = array();
        if (isset($_COOKIE["PHPSESSID"])) {
            setcookie("PHPSESSID", '', time() - 1800, '/');
        }
        session_destroy();
        echo "DESTROY<br>\n";
    }
}
if (isset($_POST['id'])) {
    $id = $_POST['id'];
    $_SESSION['id'] = $id;
} else {
    $id = $_SESSION['id'];
}
if (isset($_SESSION['id'])) {
    print "ログインしています。";
} else {
    print "ログインしていません。<br>\n";
    print "<a href='session_02_form.php'>ログイン画面へ</a>";
    die;
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="utf-8">
</head>

<body>
  <h3>※ログインしているときだけ表示されます</h3>
  <p>これは、ログインされているときだけ表示されるサンプルです。</p>
  <p>現在のログイン名:<?php echo $id; ?></p>
  <p><a href="session_02B.php">次の画面へ</a></p>
  <p><a href="session_02_form.php">ログイン画面へ</a></p>
  <form method="post" action="session_02A.php">
    <input type="hidden" name="destroy" value="end">
    <input type="submit" value="セッションを切る">
  </form>
</body>

</html>

session_02B.php

<?php session_start(); ?>
<?phperror_reporting(E_WARNING);
if (isset($_POST['destroy'])) {
    if ($_POST['destroy'] == "end"){
    $_SESSION = array();
    if (isset($_COOKIE["PHPSESSID"])) {
        setcookie("PHPSESSID", '', time() - 1800, '/');
    }
    session_destroy();
    echo "DESTROY<br>\n";
    }
}
if (isset($_POST['id'])) {
    $id = $_POST['id'];
    $_SESSION['id'] = $id;
} else {
    $id = $_SESSION['id'];
}
if (isset($_SESSION['id'])) {
    print "ログインしています。";
} else {
    print "ログインしていません。<br>n";
    print "<a href='session_02_form.php'>ログイン画面へ</a>";
    die;
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="utf-8">
</head>

<body>
  <h3>※ログインしているときだけ表示されます</h3>
  <p>これは、ログインされているときだけ表示されるサンプルです。</p>
  <p>現在のログイン名:<?php echo $id; ?></p>
  <p><a href="session_02B.php">次の画面へ</a></p>
  <p><a href="session_02_form.php">ログイン画面へ</a></p>
  <form method="post" action="session02B.php">
    <input type="hidden" name="destroy" value="end">
    <input type="submit" value="セッションを切る">
  </form>
</body>

</html>

session_02_form.php

<?php
print <<<_HTML_
<!DOCTYPE html>
<html lang="ja">

<head>
<meta charset="utf-8">
<title>sample</title>
</head>

<body>
  <p>セッションの利用。(名前を入力してログインしてください。)</p>
  <form method="post" action="session_02A.php">
    <input type="text" size="50" name="id">
    <input type="submit" value="ログイン">
  </form>
</body>

</html>
_HTML_;
?>