Web アプリ入門 / ch05 — HTML form を組み立てて受け取る / 演習 02

📝 ドリル 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>

採点

php scripts/grade.php topics/12-web/ch05-html-form/drill/02-process-form/

ヒント

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

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

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

cd topics/12-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/

テストケース

標準入力

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

期待される出力

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

📄 starter.php(雛形)

このコードから書き始めてください。

<?php

// 採点用スタブ: 標準入力の 1 行を query string として $_POST に展開
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_POST);

// TODO: $_POST['name'] と $_POST['email'] を取り出す
// TODO: htmlspecialchars でエスケープして "<p>登録しました: {name} ({email})</p>" を 1 行出力する
✅ 解答例を見る(自分で解いてから)
<?php

// 採点用スタブ: 標準入力の 1 行を query string として $_POST に展開
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_POST);

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