1. 本記事のポイント
- PHPのスーパーグローバル変数 $_GET と $_POST の基本的な違いを解説
- 利用シーンの設計判断やセキュリティ上の注意点を明示
- 実行可能なコード例付きで使い方を解説
2. PHPの $_GET と $_POST とは?
PHPでは、HTTPリクエストから受け取ったデータを扱うために、いくつかのスーパーグローバル変数が提供されています。その中でも代表的なものが $_GET
と $_POST
です。
$_GET
はURLのクエリ文字列からデータを取得する配列です。ユーザーがブラウザのアドレスバーに入力するか、リンクのパラメータとして渡された値が格納されます。一方、$_POST
はフォーム送信などで、リクエストボディに含まれるデータを受け取る配列です。
実務では、ユーザーの操作に応じて情報を渡したり、フォームデータを安全に送信する場面で使われます。設計上、情報の秘匿性や送信サイズ制限なども考慮する必要があります。
3. 詳細解説
GETリクエストで値を取得する例
URLのクエリパラメータを使って値を取得する典型的なパターンです。
// URL例: http://example.com/index.php?user=tanaka
$user = $_GET['user'];
echo "ユーザー名: $user";
// 出力: ユーザー名: tanaka
GETはURLに値が見えるため、検索条件やページ番号などの非機密データに適します。ブックマーク可能という利点もあります。
POSTリクエストでフォーム送信を受け取る例
フォーム経由で送信されたデータを受け取る方法です。
// HTMLフォーム(method="post")から送信されたと仮定
$name = $_POST['name'];
echo "こんにちは、$name さん";
// 入力: name=山田 -> 出力: こんにちは、山田 さん
POSTはURLに値が表示されず、送信サイズも大きいため、パスワードや長文データなどに適しています。
GETとPOSTを同時に扱う例
用途に応じてGETとPOSTの両方を使い分けることもあります。
$mode = $_GET['mode'] ?? 'default';
$id = $_POST['id'] ?? null;
echo "モード: $mode, ID: $id";
??
演算子を使うことで、存在しないキーによるエラーを防ぎつつ、デフォルト値を設定できます。
GETとPOSTの選定基準
- クエリパラメータを共有・保存したい → GET
- 機密性の高いデータやフォーム送信 → POST
- 冪等性が必要な処理(再読み込みで副作用なし)→ GET
- データ変更を伴う処理(登録・更新など)→ POST
HTTPの設計思想としても、GETは「取得」、POSTは「送信・変更」を前提としています。
4. よくあるミス・誤解・落とし穴
- GETでパスワードを送信:URLにパラメータが露出するため、セキュリティ的に重大な問題になります
- キーの存在チェックを怠る:未定義キーにアクセスすると警告が出るため、
isset()
や??
での対処が必要です - フォームのmethod指定ミス:HTMLフォームの
method
属性がGETになっていると、POSTデータが送られません - POSTサイズ制限の未確認:
post_max_size
やupload_max_filesize
を超えると空の配列が返される場合があります
PHPの設定やWebサーバーの制限も踏まえて、用途に応じた安全な使い方が求められます。
5. まとめ
PHPの $_GET
と $_POST
は、HTTPリクエストに含まれるデータを扱う基本的な手段です。
GETはURLパラメータを通じて非機密な情報を、POSTはフォーム送信などで機密性のあるデータを扱う用途に適しています。それぞれの特性を理解し、目的に応じて使い分けることが、セキュアで意図通りの実装につながります。