【6日でできるPHP入門】POSTによるフォームの通信

 ファイルのアップロード、ログイン認証、会員登録―これらの処理で送信される情報はユーザーの個人データや機密情報である場合が少なくありません。こうしたデータを URL に露出させず、安全かつ大容量で送る仕組みが HTTP POST メソッドです。ここでは HTML フォームに method="POST" を指定したときのリクエストフローと、PHP 側での受け取り方をサンプル付きで解説します。

1.POST メソッドの基礎

1.1. GET と POST の比較

項目GETPOST
データの送信場所URL クエリ文字列HTTP ボディ
最大サイズブラウザ依存 (数 kB 程度)理論上無制限(設定値まで)
キャッシュ対象されるされにくい
主な用途検索・一覧フィルタフォーム登録・機密データ転送

1.2. PHP スーパーグローバル

配列説明
$_POSTPOST ボディのキー=値を連想配列で保持
$_GETクエリ文字列のキー=値を保持
$_REQUEST$_GET + $_POST + $_COOKIE の合成

2.実装サンプル

2.1. 送信フォーム ― contact_post.html

ファイル名: contact_post.html

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>お問い合わせ (POST)</title></head>
<body>
<h1>お問い合わせフォーム</h1>
<form method="POST" action="contact_post.php">
  <p><label>お名前<br>
     <input type="text" name="username" placeholder="例)山田花子"></label></p>

  <p><label>メールアドレス<br>
     <input type="email" name="email" required></label></p>

  <p><label>お問い合わせ内容<br>
     <textarea name="message" rows="4" cols="40"></textarea></label></p>

  <input type="submit" value="送信">
</form>
</body>
</html>

2.2. 受信スクリプト ― contact_post.php

ファイル名: contact_post.php

<?php
// サニタイズ関数
function h(string $s): string { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); }
?>
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>送信内容の確認</title></head>
<body>
<h1>受信結果 (POST)</h1>
<table border="1" cellpadding="6">
  <tr><th>お名前</th><td><?= h($_POST['username']  ?? '') ?></td></tr>
  <tr><th>メール</th><td><?= h($_POST['email']     ?? '') ?></td></tr>
  <tr><th>内容</th><td><?= nl2br(h($_POST['message'] ?? '')) ?></td></tr>
</table>
<p><a href="contact_post.html">フォームへ戻る</a></p>
</body>
</html>

2.3. 実行手順

1.URLに「http://localhost/contact_post.html」を入力します。

「お問い合わせフォーム」が表示されます。

2.次のように入力して「送信」ボタンをクリックします。

ここでは
お名前に「山田花子」
メールアドレスに「hanako@example.com」
お問い合わせ内容に「こんにちは!」を選択します。

3.受信結果 (POST)を確認します。

3.POST を使う理由とベストプラクティス

3.1. 利点

  • URL に露出しない → パスワードや長文データに安全
  • データ長制限が緩い → ファイルアップロード・JSON 送信に最適
  • 検索エンジンのクロール対象外 → 機密ページのパラメータ隠蔽に有利

3.2. 注意点

リスク対策
XSShtmlspecialchars() で出力エスケープ
CSRFワンタイムトークンをフォームに埋め込む
迷惑ボットreCAPTCHA・rate-limit

まとめ

  • POST メソッド は URL を汚さず大容量・機密データを送れるため、登録系フォームやアップロードで標準的に使用。
  • PHP では $_POST['キー名'] で値を参照し、出力前に必ずエスケープする。
  • CSRF トークンや入力確認ページを導入すると、セキュリティとユーザー体験の両方が向上する。