`$_GET` でクエリを受け取る
テクノロジ系 / web (HTTP / $_GET / $_POST / form / php -S)
$_GET でクエリを受け取る
Lesson 12 / Chapter 3
URL の ?key=value は連想配列に化ける
http://localhost:8000/?name=太郎&age=20
─────────────
これが $_GET になるPHP からの見え方:
<?php
$_GET = [
'name' => '太郎',
'age' => '20', // ← 文字列として入ることに注意
];?の後ろのkey=value&key=valueを PHP が自動で連想配列に分解 してくれる- 値は 常に文字列 (
ageも"20"であって整数 20 ではない)
最小のサンプル
<?php
$name = $_GET['name'] ?? 'guest';
echo "こんにちは、{$name}さん\n";URL ごとの出力:
| URL | 出力 |
|---|---|
/?name=太郎 | こんにちは、太郎さん |
/?name=花子 | こんにちは、花子さん |
/ (name 無し) | こんにちは、guestさん |
?? は web トピックで覚えるべき小道具 No.1。「無ければ既定値」 を 1 行で書ける。
なぜ ?? を使うのか
// ❌ 警告が出る (Undefined array key "name") $name = $_GET['name']; // ✅ 欠落していても落ちない $name = $_GET['name'] ?? 'guest';
- Web では URL に何が付いているか分からない のが普通
- いちいち
isset($_GET['name'])を書くより??が短くて読みやすい - 「Web の入力は信用しない」 — 必ず欠落・想定外を考える癖をつける
採点用スタブ: stdin で $_GET を埋める
<?php
// 採点用: 標準入力の 1 行目 (例 "name=太郎&age=20") を $_GET に展開
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_GET);
// 以降は本物の Web と同じ
$name = $_GET['name'] ?? 'guest';
echo "こんにちは、{$name}さん\n";parse_str("name=太郎&age=20", $_GET)で URL クエリ文字列を連想配列に分解- 本物の Web では PHP が自動で
$_GETを埋めるので、このスタブは要らない - 採点ランナーは CLI なので、stdin で query string を渡してこのスタブを動かす
値が文字列であることに注意
$age = $_GET['age'] ?? '0';
echo $age + 1; // 21 (PHP が自動で数値に変換)
echo gettype($age); // string ← あくまで文字列
// 比較で罠
if ($age == 20) { ... } // OK (緩い比較で文字列 "20" と整数 20 を一致扱い)
if ($age === 20) { ... } // NG (型まで一致しない)整数として扱いたいなら 明示的に (int)$age にキャストする習慣を。
このチャプターでできるようになること
✅ URL の ?name=...&age=... を $_GET で受け取れる
✅ $_GET['name'] ?? 'guest' で欠落に備えられる
✅ parse_str で文字列を連想配列に分解できると知っている
✅ $_GET の値が文字列であることを認識している
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — $_GET['name'] で挨拶
問題
$_GET['name'] を受け取り、"こんにちは、{name}さん" を 1 行出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、answer.php の冒頭で 標準入力の 1 行をクエリ文字列として parse_str で $_GET に展開 してください (スタブはコードに含めて構いません)。
このドリルの入力例 (tests/input.txt):
name=太郎
期待される出力:
こんにちは、太郎さん
採点
php scripts/grade.php topics/web/ch03-get-params/drill/01-get-name/
ヒント
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_GET);
$name = $_GET['name'] ?? 'guest';
echo "こんにちは、{$name}さん\n";本物の Web で確認したい場合
cd topics/web/ch03-get-params/drill/01-get-name/ php -S localhost:8000 answer.php
ブラウザで http://localhost:8000/?name=太郎 を開く。
ドリル 02 — $_GET で複数キーを受け取る
問題
$_GET['name'] と $_GET['age'] を受け取り、"{name} ({age}歳)" を 1 行出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行を parse_str で $_GET に展開 するスタブを置いてください。
このドリルの入力例:
name=太郎&age=20
期待される出力:
太郎 (20歳)
採点
php scripts/grade.php topics/web/ch03-get-params/drill/02-get-multi/
ヒント
$name = $_GET['name'] ?? '名無し';
$age = $_GET['age'] ?? '?';
echo "{$name} ({$age}歳)\n";本物の Web で確認したい場合
cd topics/web/ch03-get-params/drill/02-get-multi/ php -S localhost:8000 answer.php
ブラウザで http://localhost:8000/?name=太郎&age=20 を開く。