【6日でできるPHP入門】GETとPOSTの違い

 フォーム送信で最初に押さえておきたいのが GET と POST の使い分け です。どちらもブラウザからサーバーへデータを届ける手段ですが、データの送信場所・容量・安全性などが異なります。ここでは「いつ GET を選ぶか」「なぜ POST が推奨されるのか」を比較しながら、PHP での受け取り方法やバリデーションの実装例までを掘り下げて解説します。

1.HTTP メソッドの違いを俯瞰する

1.1. GET と POST の比較表

観点GETPOST
送信方法URL クエリに付与HTTP ボディに格納
最大サイズ*2–8 kB 程度 (ブラウザ依存)理論上無制限 (設定値まで)
キャッシュ・履歴残る残らない
ブックマーク共有可能不可
セキュリティURL 露出ありURL 露出なし
PHP 配列$_GET$_POST

*Apache + Chrome の組み合わせで 2083 文字が事実上の上限と言われる。

1.2. 代表的な用途

  • GET:: 検索パラメータ・ページネーション・絞り込み
  • POST : 会員登録・ログイン・ファイルアップロード・大量テキスト送信

2.フォーム送信サンプルで体験する

2.1. GET 版 ― search.html & result_get.php

ファイル名: search.html

<!-- search.html -->
<html lang="ja">
<head><meta charset="UTF-8"><title>検索フォーム (GET)</title></head>
<body>
<h1>検索フォーム</h1>
<form method="GET" action="result_get.php">
  <input type="search" name="q" placeholder="キーワード">
  <input type="submit" value="検索">
</form>
</body>
</html>

ファイル名: result_get.php

<!-- result_get.php -->
<?php
$q = htmlspecialchars($_GET['q'] ?? '');
echo "検索語:{$q}";
?>

実行手順

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

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

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

ここでは
テキストボックスに「PHP」と入力

3.URLを確認します。

URLが以下のようになっていることを確認します。

http://localhost/result_get.php?q=PHP

2.2. POST 版 ― login.html & result_post.php

ファイル名: login.html

<!-- login.html -->
<html lang="ja">
<head><meta charset="UTF-8"><title>ログインフォーム (POST)</title></head>
<body>
<h1>ログインフォーム</h1>
<form method="POST" action="result_post.php">
  <input type="text"     name="user" placeholder="ユーザー名"><br>
  <input type="password" name="pass" placeholder="パスワード"><br>
  <input type="submit" value="ログイン">
</form>
</body>
</html>

ファイル名: result_post.php

<!-- result_post.php -->
<?php
function h($s){ return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); }

if (isset($_POST['user'], $_POST['pass'])) {
    echo 'ユーザー名:'.h($_POST['user']).'<br>';
    echo 'パスワード:'.str_repeat('●', strlen($_POST['pass']));
} else {
    echo 'フォームからアクセスしてください。';
}

実行手順

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

「ログインフォーム」が表示されます。

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

ここでは
ユーサー名に「PHP」
パスワードに「password」と入力

3.URLを確認します。

URLが以下のようになっていることを確認します。

http://localhost/result_post.php

URL は result_post.php のみ。パラメータは露出しない。

2.3. 流れを確認

  1. ブラウザが <form> を解析し method を決定。
  2. GET → エンコード後クエリ文字列に連結。
    POST → ボディ部へペイロードを格納。
  3. PHP は自動的に $_GET / $_POST 配列を生成。
  4. 受信値は htmlspecialchars() などで必ずサニタイズして出力。

3.実務での選択基準

3.1. GET を選ぶシナリオ

  • 検索結果を URL として共有したい。
  • RSS のページ番号、並び替えパラメータ
  • デバッグ時にクエリを直接入力したい。

3.2. POST を選ぶシナリオ

  • パスワードや個人情報を送る。
  • 長文コメントや JSON データを送る。
  • ファイルアップロード (enctype="multipart/form-data")
  • CSRF トークンを含めたい場合(Cookie 同期型対策)

4.関連 PHP 関数とテクニック

関数/構文目的
isset()値が送られたか判定if (isset($_POST['token'])) { … }
empty()空文字・0null 判定if (empty($_GET['page']))
htmlspecialchars()XSS 防止エスケープecho htmlspecialchars($str);
filter_input()フィルタ & サニタイズfilter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)
preg_match()正規表現チェック郵便番号や電話番号バリデーション

まとめ

  • GET は軽量・再現性重視、POST は秘匿性・容量重視。
  • 送信後の受け取りは $_GET / $_POST ― 違いはスーパーグローバル名のみ。
  • いずれの場合も サニタイズとバリデーションは必須
  • 適切に使い分けることで、ユーザー体験・セキュリティ・パフォーマンスのバランスが取れる。