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` の使い方や、より安全なデータ処理のためのバリデーションとサニタイズについて学んでいきます。