topic: session-cookie (session / cookie / login / CSRF) / ch02

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

学習目標

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

所要時間

スライド 5 分 + ドリル 2 問 = 25 分

ドリル

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

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

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

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

解説

この章の本体解説です(教材スライド由来)。

<!-- LLM_CONTEXT: Lesson 13 / Chapter 2 目的: session_start() / $_SESSION への代入と取得 扱わない: setcookie (ch03) / login (ch04) / CSRF (ch05) / regenerate_id (ch06) 読み上げ時間目安: 4 分半〜5 分 -->

session_start()$_SESSION

Lesson 13 / Chapter 2


最小の Session 操作

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

$_SESSION は連想配列 (L5 と同じ)

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

echo $_SESSION['user']['name'];   // 太郎
▶ 3v4l で実行
  • ネストした配列・オブジェクトもそのまま入る
  • 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();
▶ 3v4l で実行
  • 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
▶ 3v4l で実行

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


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

<?php
session_start();

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

または ?? で:

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

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

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

→ ドリルへ

演習問題の詳細

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

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

問題

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

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

期待される出力:

太郎

採点

php scripts/grade.php topics/13-session-cookie/ch02-session-basic/drill/01-set-and-get/

ヒント

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

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

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

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

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

問題

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

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

期待される出力:

3

採点

php scripts/grade.php topics/13-session-cookie/ch02-session-basic/drill/02-counter/

ヒント

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

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

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

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

演習問題(2問)

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

    README.md starter.php answer.php

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

    README.md starter.php answer.php

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