Webアプリケーションを作る上で、ユーザーからの入力を受け取る「フォーム」は欠かせない要素です。 PHPでは、フォームから送られてきたデータを簡単に受け取ることができます。
データを送る方法には主に「GET」と「POST」の2種類があります。これらはデータの送り方が異なり、それぞれに適した利用場面があります。今回は、GETとPOSTの基本的な違いと、PHPでのフォームデータの処理方法について学んでいきましょう!
GETリクエストとは?
GETリクエストは、主にサーバーから情報を「取得(GET)」するために使われます。フォームデータを送信する場合、データはURLの末尾に「クエリ文字列」として付加されて送られます。
GETリクエストの特徴:
- 送信データがURLに含まれるため、ユーザーに見える
- URLにデータが含まれるため、ブックマークや履歴に残せる
- 送信できるデータ量に制限がある(ブラウザやサーバーによって異なる)
- 同じリクエストを何度送っても、結果が変わらない「冪等性(べきとうせい)」を持つことが多い
- 検索キーワードの送信や、特定のページを表示するためのパラメータ指定などによく使われる
HTMLフォームの例 (GET)
HTMLフォームで `method` 属性に `get` を指定します。
<!DOCTYPE html>
<html lang="ja">
<head> <meta charset="UTF-8"> <title>GETフォームの例</title>
</head>
<body> <h1>検索フォーム</h1> <form action="search.php" method="get"> <label for="keyword">検索キーワード:</label> <input type="text" id="keyword" name="keyword"> <button type="submit">検索</button> </form>
</body>
</html>
上記のフォームで「PHP」と入力して送信すると、ブラウザのURLは `search.php?keyword=PHP` のようになります。
PHPでの受け取り方 (`$_GET`)
PHPでは、スーパーグローバル変数 `$_GET` を使ってGETリクエストで送られてきたデータを受け取ります。これは連想配列になっており、フォームの `name` 属性がキーになります。
search.php の例:
<?php
// GETリクエストから 'keyword' パラメータを受け取る
// isset() でパラメータが存在するか確認するのが安全
$keyword = isset($_GET['keyword']) ? $_GET['keyword'] : '';
// 受け取ったキーワードを表示(実際にはデータベース検索などを行う)
// htmlspecialchars() を使ってXSS対策を行うことが重要
echo '<p>検索キーワード: ' . htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8') . '</p>';
?>
POSTリクエストとは?
POSTリクエストは、主にサーバーにデータを「送信(POST)」して、リソースを作成したり更新したりするために使われます。フォームデータを送信する場合、データはHTTPリクエストのボディ部に含まれて送られます。
POSTリクエストの特徴:
- 送信データがURLに含まれないため、ユーザーには見えない
- ブックマークや履歴には残らない(URL自体は残るがデータは含まれない)
- GETに比べて送信できるデータ量が多い(理論上は制限なしだが、サーバー設定による)
- 同じリクエストを繰り返すと、意図しない結果になる可能性がある(冪等性を持たないことが多い)
- ログイン情報、ユーザー登録、記事の投稿など、機密性の高い情報や、サーバーの状態を変更する操作によく使われる
HTMLフォームの例 (POST)
HTMLフォームで `method` 属性に `post` を指定します。
<!DOCTYPE html>
<html lang="ja">
<head> <meta charset="UTF-8"> <title>POSTフォームの例</title>
</head>
<body> <h1>お問い合わせフォーム</h1> <form action="contact.php" method="post"> <div> <label for="name">お名前:</label> <input type="text" id="name" name="user_name"> </div> <div> <label for="message">メッセージ:</label> <textarea id="message" name="user_message"></textarea> </div> <button type="submit">送信</button> </form>
</body>
</html>
このフォームでデータを送信しても、URLは `contact.php` のまま変わりません。
PHPでの受け取り方 (`$_POST`)
PHPでは、スーパーグローバル変数 `$_POST` を使ってPOSTリクエストで送られてきたデータを受け取ります。これも `$_GET` と同様に、フォームの `name` 属性をキーとする連想配列です。
contact.php の例:
<?php
// POSTリクエストかどうかを確認
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // POSTリクエストからデータを受け取る $name = isset($_POST['user_name']) ? $_POST['user_name'] : ''; $message = isset($_POST['user_message']) ? $_POST['user_message'] : ''; // 受け取ったデータを表示(実際にはメール送信やDB保存などを行う) // ここでも htmlspecialchars() によるエスケープが重要 echo '<h2>お問い合わせありがとうございます</h2>'; echo '<p>お名前: ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</p>'; echo '<p>メッセージ:</p>'; echo '<p>' . nl2br(htmlspecialchars($message, ENT_QUOTES, 'UTF-8')) . '</p>'; // nl2brは改行を<br>に変換
} else { // POSTリクエスト以外でアクセスされた場合 echo '<p>フォームから送信してください。</p>';
}
?>
`$_SERVER[‘REQUEST_METHOD’]` は、現在のリクエストがGETなのかPOSTなのか(あるいは他のメソッドか)を判定するのに便利です。
GETとPOSTの使い分け
GETとPOSTのどちらを使うべきかは、送信するデータの性質や目的によって決まります。以下の表に主な違いと使い分けの指針をまとめました。
特徴 | GET | POST | 主な使い分け |
---|---|---|---|
データ送信場所 | URL(クエリ文字列) | HTTPリクエストボディ | URLに含めたくない情報(パスワードなど)はPOST |
データの可視性 | URLで丸見え | URLには見えない | 機密情報はPOST (ただしHTTPS必須) |
データ量制限 | あり (短い) | ほぼなし (サーバー設定による) | 大量のデータはPOST |
ブックマーク/履歴 | 可能 | 不可 (データ含まず) | 結果を共有・再利用したい場合はGET |
冪等性 | あり (基本的には) | なし (繰り返すと副作用の可能性) | サーバーの状態を変更しない操作はGET、変更する操作はPOST |
主な用途 | データの検索、取得 | データの作成、更新、削除、機密情報の送信 | 用途に応じて選択 |
基本的な考え方:
- 単に情報を取得するだけで、サーバーの状態を変えない場合は GET を使います。(例: 検索、ページ表示)
- サーバーにデータを送って何かを作成・変更したり、ログイン情報のような見られたくないデータを送ったりする場合は POST を使います。(例: 新規登録、ログイン、お問い合わせ送信、記事投稿)
まとめ
今回は、Webフォームからデータを送信するための基本的な方法であるGETとPOSTについて学びました。
- GET: URLにデータを含めて送信。データの取得向き。
- POST: リクエストボディにデータを含めて送信。データの送信・更新向き。
- PHPではそれぞれ `$_GET`, `$_POST` でデータを受け取る。
- セキュリティのため、ユーザー入力は `htmlspecialchars()` などで適切に処理する。
- 用途に応じてGETとPOSTを正しく使い分けることが重要。
フォーム処理はWebアプリケーション開発の基本中の基本です。しっかり理解して、安全で使いやすいアプリケーションを作れるようになりましょう!
次のステップでは、`$_GET` や `$_POST` 以外のスーパーグローバル変数 `$_REQUEST` の使い方や、より安全なデータ処理のためのバリデーションとサニタイズについて学んでいきます。