概要

ここまでで $_GET / $_POST で値を受け取れるようになった。次は 送信する側 (HTML) を自分で書く。HTML フォームの最小構造は <form action="..." method="post"> の中に <input name="key"> を並べ、<button type="submit"> を 1 つ置くだけ。<input>name 属性 が PHP 側の $_POST['name'] のキーになる対応関係を脳に刻む。

このチャプターから、1 ファイルで 「フォームを出す側」と「フォーム送信を受ける側」を兼ねる 書き方が出る。$_SERVER['REQUEST_METHOD']GET なら HTML 出力、POST なら受信内容を出力、という分岐。フレームワークではコントローラのアクションが分かれるが、生 PHP では 1 ファイルでやるのが自然。

そして HTML 出力の 絶対の習慣htmlspecialchars() でエスケープ。ユーザー入力をそのまま echo すると、<script> を埋め込まれて任意の JavaScript が走る XSS 攻撃 の入り口になる。echo htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8') が「ユーザー入力を画面に出すときの標準形」。反射的に書けるようにする。

学習目標

ドリル

no 内容
01 指定された name 属性を持つ <form> 文字列を出力
02 フォーム送信を受け取って結果ページを出力 (受け口側)

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

cd topics/web/ch05-html-form/drill/02-process-form/
php -S localhost:8000 answer.php

ブラウザで http://localhost:8000/ を開き、フォームに入力して送信。

演習: ドリル 01 — 登録フォームの HTML を出力する

問題

次の HTML を そっくりそのまま 出力する PHP を書いてください。

<form action="/register" method="post">
<input type="text" name="name">
<input type="email" name="email">
<button type="submit">送信</button>
</form>

各タグは 1 行ずつ echo すること (改行の入れ方も期待値に合わせる)。

このドリルでは標準入力は使いません。

期待される出力:

<form action="/register" method="post">
<input type="text" name="name">
<input type="email" name="email">
<button type="submit">送信</button>
</form>

ヒント

echo "<form action=\"/register\" method=\"post\">\n";
echo "<input type=\"text\" name=\"name\">\n";
// ...

シングルクォート文字列を使えばエスケープが要らない:

echo '<form action="/register" method="post">' . "\n";

演習: ドリル 02 — フォーム送信を受け取って結果を出力

問題

フォームから POST された nameemail を受け取り、次の形式で出力する PHP を書いてください。

<p>登録しました: {name} ({email})</p>

{name}{email}htmlspecialchars でエスケープしてから 埋め込むこと (XSS 対策の練習)。

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

このドリルの入力例:

name=太郎&email=taro@example.com

期待される出力:

<p>登録しました: 太郎 (taro@example.com)</p>

ヒント

$name  = htmlspecialchars($_POST['name']  ?? '', ENT_QUOTES, 'UTF-8');
$email = htmlspecialchars($_POST['email'] ?? '', ENT_QUOTES, 'UTF-8');
echo "<p>登録しました: {$name} ({$email})</p>\n";

普通の文字 (太郎 / taro@example.com) は htmlspecialchars でも変化しないので、期待値はそのまま表示される。 試しに name=<script> を渡すと &lt;script&gt; にエスケープされて、ブラウザでもタグとして解釈されない安全な状態になることを php -r で確認しても良い。

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

cd topics/web/ch05-html-form/drill/02-process-form/
php -S localhost:8000 answer.php

別ターミナルで:

curl -X POST -d "name=太郎&email=taro@example.com" http://localhost:8000/

この章を AI に聞く

  1. 「ch05 — HTML form を組み立てて受け取る」のつまずきやすいポイントを、初学者向けに3つ教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

  2. 「ch05 — HTML form を組み立てて受け取る」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    💬 ChatGPT 📘 Claude ✨ Gemini

  3. 「ch05 — HTML form を組み立てて受け取る」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    💬 ChatGPT 📘 Claude ✨ Gemini

🎉 受講お疲れさまでした!

ch05 — HTML form を組み立てて受け取る」を読み終えました。
学んだことを誰かに教えると、もっと記憶に残ります。

X で共有 Hatena LINE