`session_start()` と `$_SESSION`
テクノロジ系 / session-cookie (session / cookie / login / CSRF)
session_start() と $_SESSION
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 または ?? で書ける
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — $_SESSION['name'] への代入と取得
問題
$_SESSION['name'] に '太郎' を代入し、その値を 1 行で出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、answer.php の冒頭で session 用スタブ (use_cookies=0 / 固定 session_id) を入れて Session を擬似化してください。スタブは starter.php に最初から書いてあります。
期待される出力:
太郎
採点
php scripts/grade.php topics/session-cookie/ch02-session-basic/drill/01-set-and-get/
ヒント
// 採点用スタブの後に、こう書く $_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 で保たれている)。
ドリル 02 — $_SESSION['count'] で 3 回 increment
問題
同一プロセス内で $_SESSION['count'] を 3 回 increment して、最終的な値を 1 行で出力してください。
$_SESSION['count']が未設定なら0で初期化してから increment する- ループでも 3 回
++でも実装方法は問わない
期待される出力:
3
採点
php scripts/grade.php topics/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";本物のセッション動作で確認したい場合
cd topics/session-cookie/ch02-session-basic/drill/02-counter/ php -S localhost:8000 answer.php
ブラウザで http://localhost:8000/ を開き、リロードするたびに 3 ずつ増える ことを確認 (Session に保持されている)。