Webサイトの心臓部、ユーザー入力の処理をマスターしよう!
Webサイトでユーザーが入力した情報(例えば、検索キーワードやお問い合わせ内容)を受け取るのは、サーバーサイドプログラミングの基本的な機能です。PHPでは、主に3つの特別な変数を使って、ブラウザから送られてくるデータにアクセスします。それが $_GET
, $_POST
, $_REQUEST
です。
これらの変数は「スーパーグローバル変数」と呼ばれ、スクリプト内のどこからでもアクセスできます。今回は、それぞれの特徴と使い方、そして使い分けについて学んでいきましょう!💪
$_GET:URLでデータを送る方法
$_GET
は、HTTPのGETメソッドで送信されたデータを受け取るための連想配列です。GETメソッドでは、データはURLの末尾に「クエリ文字列」として追加されます。
例: https://example.com/search.php?keyword=PHP&page=1
この場合、search.php
スクリプト内で $_GET
を使うと、以下のようにデータにアクセスできます。
<?php
// URLが https://example.com/search.php?keyword=PHP&page=1 の場合
$keyword = $_GET['keyword']; // $keyword には 'PHP' が入る
$page = $_GET['page']; // $page には '1' が入る (文字列として)
echo "検索キーワード: " . htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8');
echo "<br>";
echo "ページ番号: " . htmlspecialchars($page, ENT_QUOTES, 'UTF-8');
?>
HTMLフォームでの指定方法:
フォームの method
属性に "get"
を指定します。
<!-- search.html -->
<form action="search.php" method="get">
<label for="keyword">検索キーワード:</label>
<input type="text" id="keyword" name="keyword">
<button type="submit">検索</button>
</form>
$_GET の特徴:
- ✅ URLにデータが表示されるため、ブックマークや共有がしやすい。
- ✅ 検索結果ページなど、内容をURLで表現したい場合に適している。
- ⚠️ URLの長さには制限があるため、送信できるデータ量に限りがある。(ブラウザやサーバーによる)
- ⚠️ パスワードなど、機密性の高い情報を送るのには絶対に適さない。
- ⚠️ データがURLで丸見えなので、セキュリティには特に注意が必要。
$_GET
で受け取った値を出力する際は、htmlspecialchars()
関数を使ってエスケープ処理を行うのが基本です。これにより、クロスサイトスクリプティング(XSS)などの脆弱性を防ぐことができます。
$_POST:見えないところでデータを送る方法
$_POST
は、HTTPのPOSTメソッドで送信されたデータを受け取るための連想配列です。POSTメソッドでは、データはHTTPリクエストのボディ部分に含まれて送信されるため、URLには表示されません。
ログイン情報、お問い合わせフォームの内容、ファイルアップロードなど、URLに表示させたくないデータや、大量のデータを送信する場合によく使われます。
<?php
// login.php (POSTリクエストを受け取る側)
if ($_SERVER['REQUEST_METHOD'] === 'POST') { // POSTリクエストか確認
$username = $_POST['username'];
$password = $_POST['password']; // 注意: パスワードは通常ハッシュ化して扱います
echo "ユーザー名: " . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
// パスワード自体を表示するのは危険なので注意
// echo "<br>パスワード: " . htmlspecialchars($password, ENT_QUOTES, 'UTF-8');
}
?>
HTMLフォームでの指定方法:
フォームの method
属性に "post"
を指定します。
<!-- login.html -->
<form action="login.php" method="post">
<label for="username">ユーザー名:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">パスワード:</label>
<input type="password" id="password" name="password">
<br>
<button type="submit">ログイン</button>
</form>
$_POST の特徴:
- ✅ データがURLに表示されないため、GETよりは機密性が高い。(ただし、HTTPS通信でないと暗号化はされません)
- ✅ 送信できるデータ量に実質的な制限はほぼない。(サーバー設定による上限はあり)
- ✅ ログイン情報、個人情報、長文データなどの送信に適している。
- ⚠️ URLだけでは状態を再現できないため、ブックマークや「戻る」ボタンでの再送信には注意が必要。(再送信の警告が出ることがある)
$_POST
で受け取ったデータも、データベースに保存したり表示したりする前には、必ずバリデーション(検証)とサニタイズ(無害化)が必要です。これは後のステップで詳しく学びます。
$_REQUEST:GETもPOSTもまとめて受け取る(でも注意が必要!)
$_REQUEST
は、$_GET
, $_POST
, そして $_COOKIE
(クッキー情報)の内容をまとめて格納する連想配列です。GETで送られてきてもPOSTで送られてきても、同じキー名であれば $_REQUEST
でアクセスできます。
<?php
// process.php (GETでもPOSTでも受け取る可能性がある場合)
// 例えば 'user_id' がGETまたはPOSTで送られてきた場合
if (isset($_REQUEST['user_id'])) {
$userId = $_REQUEST['user_id'];
echo "ユーザーID: " . htmlspecialchars($userId, ENT_QUOTES, 'UTF-8');
} else {
echo "ユーザーIDが送信されていません。";
}
?>
$_REQUEST の特徴と注意点:
- ✅ GETかPOSTかを意識せずにデータを受け取れる場合がある。(コードが短くなることも)
- ⚠️ どのメソッド(GET, POST, COOKIE)から来たデータなのか区別がつかない。 これは予期せぬ動作やセキュリティリスクの原因になりやすい。
- ⚠️ PHPの設定(
request_order
やvariables_order
ディレクティブ)によって、同じキー名があった場合にどのデータ(GET, POST, COOKIE)が優先されるかが変わる可能性がある。 - ⚠️ 意図しないデータ(例えば、COOKIEの値)がPOSTデータとして扱われてしまう可能性がある。
$_REQUEST
は便利に見えるかもしれませんが、上記のような曖昧さやセキュリティリスクがあるため、特別な理由がない限り使用は避けるべきです。データがGETで来ることを期待するなら $_GET
を、POSTで来ることを期待するなら $_POST
を明示的に使う方が、コードの意図が明確になり、安全です。
まとめ:$_GET, $_POST, $_REQUEST の使い分け
それぞれの変数の特徴をまとめると、以下のようになります。
変数 | データ送信方法 | データ表示場所 | データ量制限 | 主な用途 | 注意点 |
---|---|---|---|---|---|
$_GET |
HTTP GETメソッド | URLの末尾(クエリ文字列) | あり (短い) | 検索、ページ指定、パラメータの引き渡し | URLに表示される、機密情報NG、量制限 |
$_POST |
HTTP POSTメソッド | HTTPリクエストボディ (URLには表示されない) | ほぼなし (サーバー設定依存) | ログイン、フォーム送信、ファイルアップロード | URLに表示されない、ブックマーク不可 |
$_REQUEST |
GET, POST, COOKIE | (上記すべて) | (上記に準ずる) | (非推奨) GET/POSTを区別しない場合 | 非推奨、データソースが曖昧、セキュリティリスク |
基本的には、データの性質と目的に合わせて $_GET
と $_POST
を使い分けることが重要です。
- ページの状態を表すパラメータや検索キーワードなど、公開されても問題なく、ブックマークさせたい場合は
$_GET
を使います。 - ログイン情報や個人情報、大量のデータなど、URLに含めたくない・含められない場合は
$_POST
を使います。 $_REQUEST
は、その曖昧さからバグやセキュリティホールの原因となりやすいため、使用を避けましょう。
今回学んだ方法でユーザーからのデータを受け取れるようになりましたね!🎉 しかし、受け取ったデータをそのまま使うのは非常に危険です。次回は、受け取ったデータが安全かを確認する「バリデーション」と、データを無害化する「サニタイズ」について学びます。お楽しみに!🚀