[PHPのはじめ方] Part13: GETとPOSTの違いとフォーム処理

Webアプリケーションを作る上で、ユーザーからの入力を受け取る「フォーム」は欠かせない要素です。😊 PHPでは、フォームから送られてきたデータを簡単に受け取ることができます。

データを送る方法には主に「GET」と「POST」の2種類があります。これらはデータの送り方が異なり、それぞれに適した利用場面があります。今回は、GETとPOSTの基本的な違いと、PHPでのフォームデータの処理方法について学んでいきましょう!

GETリクエストとは? 🤔

GETリクエストは、主にサーバーから情報を「取得(GET)」するために使われます。フォームデータを送信する場合、データはURLの末尾に「クエリ文字列」として付加されて送られます。

GETリクエストの特徴:

  • 送信データがURLに含まれるため、ユーザーに見える 👀
  • 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>';
?>
⚠️ 注意: ユーザーからの入力は常に信頼せず、表示する前には `htmlspecialchars()` などを使ってエスケープ処理(サニタイズ)を行い、クロスサイトスクリプティング(XSS)攻撃を防ぎましょう。この処理については、後のステップ「バリデーションとサニタイズ」で詳しく学びます。

POSTリクエストとは? 🤔

POSTリクエストは、主にサーバーにデータを「送信(POST)」して、リソースを作成したり更新したりするために使われます。フォームデータを送信する場合、データはHTTPリクエストのボディ部に含まれて送られます。

POSTリクエストの特徴:

  • 送信データがURLに含まれないため、ユーザーには見えない 🔒
  • ブックマークや履歴には残らない(URL自体は残るがデータは含まれない)
  • GETに比べて送信できるデータ量が多い(理論上は制限なしだが、サーバー設定による)
  • 同じリクエストを繰り返すと、意図しない結果になる可能性がある(冪等性を持たないことが多い)
  • ログイン情報、ユーザー登録、記事の投稿など、機密性の高い情報や、サーバーの状態を変更する操作によく使われる
💡 ポイント: データがURLに表示されないため、GETよりは安全に見えますが、通信自体が暗号化されていないと意味がありません。重要なデータを扱う場合は、必ずHTTPS通信を使いましょう。

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