ch03 6章中 3章目

ch03 — `$_GET` でクエリ文字列を受け取る

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch03 — `$_GET` でクエリ文字列を受け取る」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch03 — `$_GET` でクエリ文字列を受け取る」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch03 — `$_GET` でクエリ文字列を受け取る」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

URL の末尾に付く ?name=太郎&age=20 の部分を クエリ文字列 と呼ぶ。Web で最もよく使われる「ブラウザからサーバーへ値を渡す方法」で、PHP では $_GET 連想配列 から取り出せる。$_GET['name']'太郎'$_GET['age']'20' というシンプルな関係。

ここで必ずぶつかるのが キーが無かったときの Warning?name=太郎 しか無いのに $_GET['age'] を読むと未定義キーで警告が出る。これを防ぐのが null 合体演算子 ?? で、$_GET['age'] ?? '不明' と書けば「無ければ '不明'」になる。Web で値を受け取る全場面で使うイディオム。

採点ランナーは CLI なので、$_GETstdin から parse_str で組み立てるスタブ が冒頭に入っている。parse_str('name=太郎&age=20', $_GET) の 1 行で文字列を配列に展開する関数。php -S で動かすときはブラウザの URL に ?name=... を付けるだけで $_GET に勝手に入ってくる。

学習目標

  • URL の ?key=value&key2=value2$_GET 連想配列で受け取れる
  • $_GET['key'] ?? 'default'欠落に強い コードを書ける
  • 採点用に stdin から query string を parse_str$_GET に組み立てる 書き方を知る

ドリル

no 内容
01 name=太郎 を受け取り "こんにちは、太郎さん" を出力
02 name=太郎&age=20 を受け取り "太郎 (20歳)" を出力

本物の Web で確認したい場合

cd topics/web/ch03-get-params/drill/01-get-name/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/?name=太郎 を開く (URL に ?name=... を付けるのを忘れない)。

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. $_GET でクエリを受け取る

    Lesson 12 / Chapter 3

  2. URL の ?key=value は連想配列に化ける

    http://localhost:8000/?name=太郎&age=20
                           ─────────────
                           これが $_GET になる

    PHP からの見え方:

    <?php
    $_GET = [
        'name' => '太郎',
        'age'  => '20',   // ← 文字列として入ることに注意
    ];
    • ? の後ろの key=value&key=valuePHP が自動で連想配列に分解 してくれる
    • 値は 常に文字列 (age"20" であって整数 20 ではない)
  3. 最小のサンプル

    <?php
    $name = $_GET['name'] ?? 'guest';
    echo "こんにちは、{$name}さん\n";

    URL ごとの出力:

    URL 出力
    /?name=太郎 こんにちは、太郎さん
    /?name=花子 こんにちは、花子さん
    / (name 無し) こんにちは、guestさん

    ?? は web トピックで覚えるべき小道具 No.1。「無ければ既定値」 を 1 行で書ける。

  4. なぜ ?? を使うのか

    // ❌ 警告が出る (Undefined array key "name")
    $name = $_GET['name'];
    
    // ✅ 欠落していても落ちない
    $name = $_GET['name'] ?? 'guest';
    • Web では URL に何が付いているか分からない のが普通
    • いちいち isset($_GET['name']) を書くより ?? が短くて読みやすい
    • 「Web の入力は信用しない」 — 必ず欠落・想定外を考える癖をつける
  5. 採点用スタブ: 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 を渡してこのスタブを動かす
  6. 値が文字列であることに注意

    $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 にキャストする習慣を。

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

    ✅ URL の ?name=...&age=...$_GET で受け取れる ✅ $_GET['name'] ?? 'guest' で欠落に備えられる ✅ parse_str で文字列を連想配列に分解できると知っている ✅ $_GET の値が文字列であることを認識している

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

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 の値が文字列であることを認識している

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — `$_GET['name']` で挨拶 README.md starter.php answer.php
  2. 02 ドリル 02 — `$_GET` で複数キーを受け取る README.md starter.php answer.php

演習問題の詳細

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

ドリル 01 — `$_GET['name']` で挨拶

問題

$_GET['name'] を受け取り、"こんにちは、{name}さん" を 1 行出力する PHP を書いてください。

採点ランナーは CLI 直実行なので、answer.php の冒頭で 標準入力の 1 行をクエリ文字列として parse_str$_GET に展開 してください (スタブはコードに含めて構いません)。

このドリルの入力例 (tests/input.txt):

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=太郎 を開く。

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — `$_GET` で複数キーを受け取る

問題

$_GET['name']$_GET['age'] を受け取り、"{name} ({age}歳)" を 1 行出力する PHP を書いてください。

採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行を parse_str$_GET に展開 するスタブを置いてください。

このドリルの入力例:

name=太郎&age=20

期待される出力:

太郎 (20歳)

ヒント

$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 を開く。

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — `$_GET['name']` で挨拶

    README.md starter.php answer.php

  2. ドリル 02 — `$_GET` で複数キーを受け取る

    README.md starter.php answer.php

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

完了にすると進捗に反映されます