セッション

(ブログ記事の一覧は「こちら」)

ログイン認証やショッピングカートのような場面では、ブラウザを開いているうちは、ページが切り替わっても入力した情報がサーバー側に保持されるので、データは残り続けます。そのような仕組みをセッションと呼びます。セッションの基本的な仕組みについて学びます。

ここで学ぶこと

  • クッキー、セッション
  • session_start() 関数
  • セッション変数($_SESSION)

「クッキー」はブラウザ側で保持するキーと値のことで、「セッション」はサーバー側に保持するキーと値のことです。
PHPはサーバー側で実行されるプログラムですので、セッションに関するプログラムを記述することで、その情報がクッキーにも保持される仕組みになっています。

  • var_dump(デバッグ用の表示)
  • header関数(リダイレクト)

参考:

セッション処理(PHPマニュアル)
header関数(PHPマニュアル)

例題

作成するもの

以下の流れにようになるPHPプログラムを作成します。

session_top ⇒ session_set ⇒ session_check ⇒ session_top
                        ⇒ session_delete

順次説明していきます。

プログラム

まず、POSTでデータを送信する画面「session_top.php」を作成します。

<?php
    session_start();

    var_dump($_SESSION);
?>

<html>
<head>
   <meta charset="UTF-8">
</head>

<body>
    <h1>POSTでデータを送信する</h1>
    <form action="session_set.php" method="POST">
        <p>名前:<input type="text" name="name"></p>
        <p>趣味:<input type="text" name="hobby"></p>
        <input type="submit" value="送信する">
    </form>
</body>
</html>


次に、POSTで受信したデータをSESSIONに渡す画面「session_set.php」を作成します。

<?php
    session_start();

    $_SESSION['name'] = $_POST['name'];
    $_SESSION['hobby'] = $_POST['hobby'];

    var_dump($_SESSION);
?>

<html>
<body>
    <h1>POSTで受信したデータをSESSIONに渡す</h1>
    <a href="session_check.php">確認画面へ</a>
</body>
</html>


SESSIONが引き続き受信できていることを確認する画面「session_check.php」を作成します。

<?php
    session_start();

    var_dump($_SESSION);

    $name = $_SESSION['name'];
    $hobby = $_SESSION['hobby'];
?>

<html>
<head>
   <meta charset="UTF-8">
</head>

<body>
    <h1>SESSIONが引き続き受信できていることを確認</h1>
    <p>あなたは<?php echo $name;?>さんです。</p>
    <p>あなたの趣味は<?php echo $hobby;?>です。</p>

    <p><a href="session_top.php">トップに戻る</a></p>
    <p><a href="session_delete.php">セッションデータを削除</a></p>
</body>
</html>

「トップに戻る」を選択したときも、セッションの情報が引き継がれることが確認できます。(session_top.php の冒頭で session_start(); を呼んでいることから)


最後に、全てのセッションを削除する画面「session_delete.php」を作成します。

<?php
    session_start();

    // セッション変数を全て解除する
    $_SESSION = array();

    // クッキーも削除する
    $session_name = session_name();
    if (isset($_COOKIE[$session_name]) === TRUE) {
        setcookie($session_name, '', time() - 3600);
    }

    // セッションのデータを破棄
    session_destroy();

    var_dump($_SESSION);
?>

<html>
<body>
    <h1>全てのSESSIONを削除</h1>
    <a href="session_top.php">トップに戻る</a>
</body>
</html>

実行、確認

「session_top.php」を実行して、順次進んでください。
「session_check.php」でセッションの保持、「session_delete.php」で全てのセッションが削除されることを確認してください。

参考

全てのセッションを削除する画面「session_delete.php」から自動的にトップ画面「session_top.php」に移動させたい、ということも考えられます。(このような処理をリダイレクトと呼びます。)
その場合、PHPスクリプトの最後に以下の header関数と exit関数を追加することで実現できます。(画面は表示されなくなるため、HTML部分の記述は不要になります。)

「session_delete.php」に以下を追記することで実現できます。

<?php
    (省略)

    // 強制的に、トップに戻る
    header("Location: session_top.php");
    exit();
?>

課題1

「session_top.php」のテキストボックスに、セッションでセットした値が入るように修正してください。
また、「性別」(男、女)、「血液型」(A型、B型、O型、AB型)を選択する項目を追加して、さらにそれぞれの選択した値をセッションに加えて、正しく動作するように修正してください。

課題2

課題1のプログラムに対して、以下の追加の修正を行ってください。

「session_delete.php」では全てのセッションが削除されてしましたが、「名前」「趣味」「性別」「血液型」それぞれのセッションを個別に削除する機能を追加してください。

個別にセッションを削除するには、unset関数を使用します。
例えば、「名前」のセッション 'name' を削除する場合は以下のように記述します。

unset($_SESSION['name']);