ch02 6章中 2章目

ch02 — `session_start()` と `$_SESSION` の基本

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch02 — `session_start()` と `$_SESSION` の基本」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch02 — `session_start()` と `$_SESSION` の基本」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch02 — `session_start()` と `$_SESSION` の基本」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

Session を使う入り口は session_start() 関数。これを呼んだ瞬間、PHP は「クライアントから来た Cookie に PHPSESSID があればそれを使い、無ければ新規発行する」「対応する Session ファイルがあれば読み込み、無ければ新規作成する」をまとめて面倒見てくれる。利用者は呼ぶだけで、後は $_SESSION 連想配列 に値を入れたり取ったりすればよい。

$_SESSION['name'] = '太郎' と書いて画面を閉じても、次に同じブラウザで開けば '太郎' のまま読める。値が サーバー側のファイル (/tmp/sess_<sessionId> 等) に書かれていて、ブラウザ側には ID しか残らない構造だから。本物のデータはサーバー管理下、という安全な設計。

採点ランナーは CLI で動く ので、Cookie 経由の ID 同期はそのまま再現できない。代わりに ini_set('session.use_cookies', '0') で Cookie 機構を切り、session_id('固定ID') で ID を直接指定する 採点用スタブ が冒頭に入っている。これで 1 プロセス内でも session_start を擬似的に呼べる、と理解する。

学習目標

  • session_start() で Session を開始できる
  • $_SESSION['key'] = value で値を保存し、$_SESSION['key'] で取り出せる
  • CLI 採点用の session スタブ (use_cookies=0 / 固定 session_id) を理解して使える

ドリル

no 内容
01 $_SESSION['name']'太郎' を保存して echo
02 同一プロセス内で $_SESSION['count'] を 3 回 increment して最終値を出力

本物のセッション動作で確認したい場合

cd topics/session-cookie/ch02-session-basic/drill/01-set-and-get/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/ を開く。リロードすると Session が保持されていることを開発者ツール (Application → Cookies) で PHPSESSID として確認できる。

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. session_start()$_SESSION

    Lesson 13 / Chapter 2

  2. 最小の Session 操作

    <?php
    session_start();                   // 1. Session を開始する
    $_SESSION['name'] = '太郎';        // 2. 連想配列に書き込む
    echo $_SESSION['name'];            // 3. 読み出す
    • session_start()最初に呼ぶ のが鉄則 (ヘッダ送信より前)
    • $_SESSION はただの連想配列。読み書きの作法は $_GET / $_POST と同じ
    • リクエストをまたいでも、同じブラウザなら $_SESSION['name']残り続ける
  3. $_SESSION は連想配列 (array-assoc トピックと同じ)

    <?php
    session_start();
    $_SESSION['user'] = [
        'id'   => 42,
        'name' => '太郎',
        'role' => 'admin',
    ];
    
    echo $_SESSION['user']['name'];   // 太郎
    • ネストした配列・オブジェクトもそのまま入る
    • PHP が裏側でシリアライズして保存してくれるので、利用側は気にしなくて良い

    → ただし「何を入れるか」は自分で決める。何でも詰めると Session が肥大化する。

  4. CLI 採点用スタブ: cookie を切る

    session_start()本来 ブラウザ + Web サーバーが前提。CLI で素直に呼ぶと:

    PHP Warning: session_start(): Cannot send session cookie - headers already sent

    CLI で安定動作させるために、Cookie 経路を切る スタブを冒頭に置く:

    <?php
    // 採点用スタブ: header() / cookie 関連の警告を抑止
    ini_set('session.use_cookies', '0');
    ini_set('session.use_only_cookies', '0');
    session_id('TESTSESSIONID');  // 固定 ID で Session を擬似化
    @session_start();
    • use_cookies=0 で Cookie 自動発行を止める
    • session_id()固定 ID を渡し、毎回同じ Session を引けるようにする
    • 本物の Web では PHP が自動で ID を発行するので、このスタブは不要
  5. 同一プロセス内でも $_SESSION は使える

    採点ランナーは 1 リクエストぶんしか実行しない。それでも $_SESSION を使う意味は:

    <?php
    // 採点用スタブ ...
    
    $_SESSION['count'] = 0;
    for ($i = 0; $i < 3; $i++) {
        $_SESSION['count']++;
    }
    echo $_SESSION['count'];   // 3

    プロセス内で」読み書きできるので、ログイン → マイページのような 2 リクエスト分のシナリオを 1 スクリプトで擬似化 できる (ch04 で使う)。

  6. 「無ければ初期化」のお作法

    <?php
    session_start();
    
    // ✅ 初回アクセスでも落ちない
    if (!isset($_SESSION['count'])) {
        $_SESSION['count'] = 0;
    }
    $_SESSION['count']++;
    echo $_SESSION['count'];

    または ?? で:

    $_SESSION['count'] = ($_SESSION['count'] ?? 0) + 1;
    • 初回アクセス時は $_SESSION は空 → そのまま ++ すると警告
    • isset?? で必ず初期値を用意する
  7. このチャプターでできるようになること

    session_start() で Session を開始できる ✅ $_SESSION['key'] = value で値を保存・取得できる ✅ CLI 採点用スタブ (use_cookies=0 + 固定 session_id) を理解している ✅ 「無ければ初期化」を isset または ?? で書ける

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

Lesson 13 / Chapter 2


最小の Session 操作

<?php
session_start();                   // 1. Session を開始する
$_SESSION['name'] = '太郎';        // 2. 連想配列に書き込む
echo $_SESSION['name'];            // 3. 読み出す
  • session_start()最初に呼ぶ のが鉄則 (ヘッダ送信より前)
  • $_SESSION はただの連想配列。読み書きの作法は $_GET / $_POST と同じ
  • リクエストをまたいでも、同じブラウザなら $_SESSION['name']残り続ける

$_SESSION は連想配列 (array-assoc トピックと同じ)

<?php
session_start();
$_SESSION['user'] = [
    'id'   => 42,
    'name' => '太郎',
    'role' => 'admin',
];

echo $_SESSION['user']['name'];   // 太郎
  • ネストした配列・オブジェクトもそのまま入る
  • PHP が裏側でシリアライズして保存してくれるので、利用側は気にしなくて良い

→ ただし「何を入れるか」は自分で決める。何でも詰めると Session が肥大化する。


CLI 採点用スタブ: cookie を切る

session_start()本来 ブラウザ + Web サーバーが前提。CLI で素直に呼ぶと:

PHP Warning: session_start(): Cannot send session cookie - headers already sent

CLI で安定動作させるために、Cookie 経路を切る スタブを冒頭に置く:

<?php
// 採点用スタブ: header() / cookie 関連の警告を抑止
ini_set('session.use_cookies', '0');
ini_set('session.use_only_cookies', '0');
session_id('TESTSESSIONID');  // 固定 ID で Session を擬似化
@session_start();
  • use_cookies=0 で Cookie 自動発行を止める
  • session_id()固定 ID を渡し、毎回同じ Session を引けるようにする
  • 本物の Web では PHP が自動で ID を発行するので、このスタブは不要

同一プロセス内でも $_SESSION は使える

採点ランナーは 1 リクエストぶんしか実行しない。それでも $_SESSION を使う意味は:

<?php
// 採点用スタブ ...

$_SESSION['count'] = 0;
for ($i = 0; $i < 3; $i++) {
    $_SESSION['count']++;
}
echo $_SESSION['count'];   // 3

プロセス内で」読み書きできるので、ログイン → マイページのような 2 リクエスト分のシナリオを 1 スクリプトで擬似化 できる (ch04 で使う)。


「無ければ初期化」のお作法

<?php
session_start();

// ✅ 初回アクセスでも落ちない
if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}
$_SESSION['count']++;
echo $_SESSION['count'];

または ?? で:

$_SESSION['count'] = ($_SESSION['count'] ?? 0) + 1;
  • 初回アクセス時は $_SESSION は空 → そのまま ++ すると警告
  • isset?? で必ず初期値を用意する

このチャプターでできるようになること

session_start() で Session を開始できる ✅ $_SESSION['key'] = value で値を保存・取得できる ✅ CLI 採点用スタブ (use_cookies=0 + 固定 session_id) を理解している ✅ 「無ければ初期化」を isset または ?? で書ける

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — `$_SESSION['name']` への代入と取得 README.md starter.php answer.php
  2. 02 ドリル 02 — `$_SESSION['count']` で 3 回 increment README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — `$_SESSION['name']` への代入と取得

問題

$_SESSION['name']'太郎' を代入し、その値を 1 行で出力する PHP を書いてください。

採点ランナーは CLI 直実行なので、answer.php の冒頭で session 用スタブ (use_cookies=0 / 固定 session_id) を入れて Session を擬似化してください。スタブは starter.php に最初から書いてあります。

期待される出力:

太郎

ヒント

// 採点用スタブの後に、こう書く
$_SESSION['name'] = '太郎';
echo $_SESSION['name'] . "\n";

本物のセッション動作で確認したい場合

cd topics/session-cookie/ch02-session-basic/drill/01-set-and-get/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/ を開く。リロードしても同じ値が表示される (Session が PHPSESSID で保たれている)。

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — `$_SESSION['count']` で 3 回 increment

問題

同一プロセス内で $_SESSION['count']3 回 increment して、最終的な値を 1 行で出力してください。

  • $_SESSION['count'] が未設定なら 0 で初期化してから increment する
  • ループでも 3 回 ++ でも実装方法は問わない

期待される出力:

3

ヒント

$_SESSION['count'] = $_SESSION['count'] ?? 0;
for ($i = 0; $i < 3; $i++) {
    $_SESSION['count']++;
}
echo $_SESSION['count'] . "\n";

本物のセッション動作で確認したい場合

cd topics/session-cookie/ch02-session-basic/drill/02-counter/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/ を開き、リロードするたびに 3 ずつ増える ことを確認 (Session に保持されている)。

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — `$_SESSION['name']` への代入と取得

    README.md starter.php answer.php

  2. ドリル 02 — `$_SESSION['count']` で 3 回 increment

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます