topic: session-cookie (session / cookie / login / CSRF) / ch04
ch04 — ログイン状態を `$_SESSION` で保つ
学習目標
- 「ログイン」=
$_SESSIONにユーザー情報を入れる、と言える - 「ログアウト」=
session_destroy()または$_SESSION = []、と言える - 「2 リクエスト分の動き」を 1 つの PHP で 連続実行 して擬似化できる
所要時間
スライド 5 分 + ドリル 2 問 = 30 分
ドリル
| no | 内容 |
|---|---|
| 01 | 「ログイン → マイページ表示」を 1 スクリプトで擬似化 |
| 02 | 「ログイン → ログアウト → 状態確認」を 1 スクリプトで擬似化 |
本物のセッション動作で確認したい場合
cd topics/13-session-cookie/ch04-login-flow/drill/01-login/
php -S localhost:8000 answer.php
ブラウザで http://localhost:8000/?name=太郎 を開くと「ようこそ、太郎さん」が出る。
リロードすると Session が保たれて同じ表示。
演習問題の詳細
この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。
ドリル 01 — ログイン → マイページ表示
問題
$_SESSION を使って「ログイン → マイページ表示」を 1 スクリプトで擬似化してください。
- 標準入力 1 行目をログインフォームの送信 (例:
name=太郎) と見なし、$_POSTに展開する - 「ログイン処理」として
$_SESSION['user'] = ['name' => $_POST['name']]を実行する - 「マイページ」として
isset($_SESSION['user'])を判定し、"ようこそ、{name}さん"を出力する
このドリルの入力例 (tests/input.txt):
name=太郎
期待される出力:
ようこそ、太郎さん
採点
php scripts/grade.php topics/13-session-cookie/ch04-login-flow/drill/01-login/
ヒント
// 「リクエスト 1: ログインフォーム送信」
$line = trim(fgets(STDIN) ?: '');
parse_str($line, $_POST);
$_SESSION['user'] = ['name' => $_POST['name']];
// 「リクエスト 2: マイページ」
if (isset($_SESSION['user'])) {
echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
echo "未ログイン\n";
}本物の Web で確認したい場合
cd topics/13-session-cookie/ch04-login-flow/drill/01-login/
php -S localhost:8000 answer.php
ブラウザで http://localhost:8000/?name=太郎 を開く (ドリルでは $_POST 想定だが、php -S 単独確認時は $_GET で代用可)。
ドリル 02 — ログイン → ログアウト → 状態確認
問題
$_SESSION を使って「ログイン → ログアウト → マイページ再表示」を 1 スクリプトで擬似化してください。
- 標準入力 1 行目をログインフォームの送信 (
name=太郎) と見なす - 「ログイン処理」として
$_SESSION['user']に名前を格納 - 「ログアウト処理」として
$_SESSION = []+session_destroy()を実行 - ログアウト後にもう一度
session_start()を呼び、isset($_SESSION['user'])の判定結果に応じて"ログアウト済"を出力する
このドリルの入力例 (tests/input.txt):
name=太郎
期待される出力:
ログイン: 太郎
ログアウト済
採点
php scripts/grade.php topics/13-session-cookie/ch04-login-flow/drill/02-logout/
ヒント
// リクエスト 1: ログイン
parse_str(trim(fgets(STDIN) ?: ''), $_POST);
$_SESSION['user'] = ['name' => $_POST['name']];
echo "ログイン: {$_SESSION['user']['name']}\n";
// リクエスト 2: ログアウト
$_SESSION = [];
@session_destroy();
// リクエスト 3: 再アクセス
@session_start();
if (isset($_SESSION['user'])) {
echo "ようこそ、{$_SESSION['user']['name']}さん\n";
} else {
echo "ログアウト済\n";
}本物の Web で確認したい場合
cd topics/13-session-cookie/ch04-login-flow/drill/02-logout/
php -S localhost:8000 answer.php 演習問題(2問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。