概要
GET が「URL に値が乗る通信」だったのに対し、POST はリクエスト本文 (Body) に値が乗る通信。<form method="post"> で送信ボタンを押すと、ブラウザは値を URL ではなく Body に詰めてサーバーに送る。PHP では $_POST 連想配列 から取り出す。使い方は $_GET とほぼ同じ。
使い分けの基準はシンプルに 取得 → GET / 送信・更新 → POST。検索結果のように何度開いても結果が変わらないものは GET、ログインやコメント投稿のように「サーバーに記録させる」操作は POST、と分けるのが Web の作法。GET は履歴やブックマークに URL ごと残るので、パスワード送信に GET を使うのは事故のもと。
POST の Body のフォーマットは application/x-www-form-urlencoded (普通のテキストフォーム) と multipart/form-data (ファイル添付があるとき) の 2 種類。普段のフォームは前者で、Body に key=value&key=value の文字列が乗っているだけ。後者はファイルアップロードを扱う file-io/ch06 で再登場する。
学習目標
$_POSTでフォームの method=post で送られた値を受け取れる- GET と POST の 使い分け (取得 vs 送信) を説明できる
- 採点用に stdin から query string を
parse_strで$_POSTに組み立てる 書き方を知る
ドリル
| no | 内容 |
|---|---|
| 01 | message=Hello を受け取り "受信: Hello" を出力 |
| 02 | name=太郎&email=taro@example.com を受け取り "登録: 太郎 / taro@example.com" を出力 |
本物の Web で確認したい場合
POST はブラウザのアドレスバーから送れないので、フォーム送信か curl を使う:
cd topics/web/ch04-post-params/drill/01-post-message/
php -S localhost:8000 answer.php
別ターミナルで:
curl -X POST -d "message=Hello" http://localhost:8000/📝 演習: ドリル 01 — `$_POST['message']` を受信して表示
問題
$_POST['message'] を受け取り、"受信: {message}" を 1 行出力する PHP を書いてください。
採点ランナーは CLI 直実行なので、冒頭で stdin の 1 行を parse_str で $_POST に展開 するスタブを置いてください。
このドリルの入力例:
message=Hello
期待される出力:
受信: Helloヒント
$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ヒント
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
echo "登録: {$name} / {$email}\n";@ などの記号も parse_str がよしなに扱ってくれる (URL エンコードされていれば自動でデコード)。