採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

`$_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=valuePHP が自動で連想配列に分解 してくれる
  • 値は 常に文字列 (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 を開く。