[PHPのはじめ方] Part14: $_GET, $_POST, $_REQUEST の使用方法

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_ordervariables_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 は、その曖昧さからバグやセキュリティホールの原因となりやすいため、使用を避けましょう。

今回学んだ方法でユーザーからのデータを受け取れるようになりましたね!🎉 しかし、受け取ったデータをそのまま使うのは非常に危険です。次回は、受け取ったデータが安全かを確認する「バリデーション」と、データを無害化する「サニタイズ」について学びます。お楽しみに!🚀