`$_POST` でフォームを受け取る
テクノロジ系 / web (HTTP / $_GET / $_POST / form / php -S)
$_POST でフォームを受け取る
Lesson 12 / Chapter 4
$_POST は 本文 (body) から来る
GET: 値は URL の後ろ (見える)
GET /register?name=太郎 HTTP/1.1
POST: 値はリクエストの 本文 (URL には乗らない)
POST /register HTTP/1.1 Content-Type: application/x-www-form-urlencoded name=太郎
PHP は 本文の中身を $_POST 連想配列に分解 して渡してくれる。
GET と POST の使い分け
| 用途 | 推奨 | 理由 |
|---|---|---|
| 検索ページ | GET | URL を共有できる / ブックマークできる |
| 一覧の絞り込み | GET | 結果ページを再現可能 |
| 新規登録 / 投稿 | POST | URL に個人情報が残らない / 履歴・キャッシュに乗らない |
| 削除 / 編集 | POST | 副作用がある操作はリロードで重複しないように |
原則: 「取得は GET、副作用 (DB を書き換える) は POST」。
受け取り方は $_GET と同じ
<?php
$msg = $_POST['message'] ?? '';
echo "受信: {$msg}\n";$_POSTは 連想配列 ($_GET と同じ構造)- 値は 文字列 ($_GET と同じ)
- 欠落時の保険として
??を使うのも同じ
→ 違うのは「どっち経由で来たか」だけ。コード側のアクセス方法は揃っている。
採点用スタブ: stdin で $_POST を埋める
<?php
// 採点用: 標準入力の 1 行 (例 "message=Hello") を $_POST に展開
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_POST);
$msg = $_POST['message'] ?? '';
echo "受信: {$msg}\n";$_GETのときと同じくparse_strで文字列を連想配列に分解- 違うのは展開先が
$_POSTであること - 本物の Web では PHP が自動で
$_POSTを埋める
どっちが入っているか確認するには REQUEST_METHOD
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$msg = $_POST['message'] ?? '';
echo "POST 受信: {$msg}\n";
} else {
echo "GET アクセス (form を表示)\n";
}- 1 つの URL で GET と POST 両方 を捌くのが Web の典型 (ch06 でやる)
REQUEST_METHODを見て分岐するのが定石
このチャプターでできるようになること
✅ $_POST でフォーム値を受け取れる
✅ GET と POST の使い分けを言える
✅ parse_str で stdin の文字列を $_POST にも展開できる
✅ REQUEST_METHOD で GET / POST を区別できると知っている
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — $_POST['message'] を受信して表示
問題
$_POST['message'] を受け取り、"受信: {message}" を 1 行出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行を parse_str で $_POST に展開 するスタブを置いてください。
このドリルの入力例:
message=Hello
期待される出力:
受信: Hello
採点
php scripts/grade.php topics/web/ch04-post-params/drill/01-post-message/
ヒント
$query = trim(fgets(STDIN) ?: '');
parse_str($query, $_POST);
$msg = $_POST['message'] ?? '';
echo "受信: {$msg}\n";ドリル 02 — $_POST で複数フィールド (登録フォームの受け口)
問題
$_POST['name'] と $_POST['email'] を受け取り、"登録: {name} / {email}" を 1 行出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行を parse_str で $_POST に展開 するスタブを置いてください。
このドリルの入力例:
name=太郎&email=taro@example.com
期待される出力:
登録: 太郎 / taro@example.com
採点
php scripts/grade.php topics/web/ch04-post-params/drill/02-post-form/
ヒント
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
echo "登録: {$name} / {$email}\n";@ などの記号も parse_str がよしなに扱ってくれる (URL エンコードされていれば自動でデコード)。