採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

`$_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 の使い分け

用途推奨理由
検索ページGETURL を共有できる / ブックマークできる
一覧の絞り込みGET結果ページを再現可能
新規登録 / 投稿POSTURL に個人情報が残らない / 履歴・キャッシュに乗らない
削除 / 編集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 エンコードされていれば自動でデコード)。