PHPのGETとPOSTの違いとは?フォームとファイルアップロードの基本を解説

Webサイトがユーザーと対話するために欠かせないHTMLフォーム。検索キーワード、ログイン情報、お問い合わせ内容など、ユーザーが入力したデータをサーバーに送信するには、いくつかの「送信方法(メソッド)」があります。

その中でも特に重要なのがGETPOSTです。この2つは似ているようで、その特性や使われるべき場面が全く異なります。

この記事では、GETPOSTの基本的な使い方と明確な違い、さらにはPOSTを使った応用的な機能であるファイルアップロード処理まで、初心者の方にも分かりやすく解説します。


目次

1. GETメソッド 〜URLでデータを送る〜

GETメソッドは、送信するデータをURLの末尾に付けてサーバーに送る方法です。

GETの使い方

formタグのmethod属性に"GET"を指定します。

【送信ページ form_get.html

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>GETフォーム</title></head>
<body>
    <h1>GETでデータを送信します</h1>
    <form action="receive_get.php" method="GET">
        <label>お名前: <input type="text" name="user_name"></label>
        <label>キーワード: <input type="text" name="keyword"></label>
        <input type="submit" value="送信する">
    </form>
</body>
</html>

【受信ページ receive_get.php PHPでは、$_GETというスーパーグローバル変数でデータを受け取ります。

<?php
$user_name = $_GET['user_name'] ?? '名無し';
$keyword = $_GET['keyword'] ?? '';
?>
<p>ようこそ、<?php echo htmlspecialchars($user_name, ENT_QUOTES, 'UTF-8'); ?>さん</p>
<p>検索キーワード: <?php echo htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8'); ?></p>

「名無し」「キーワード」と入力して送信すると、ブラウザのアドレスバーは次のようになります。 http://example.com/receive_get.php?user_name=名無し&keyword=キーワード

GETの特徴と主な用途

  • 特徴:
    • 送信データがURLに表示される
    • URLに含められるデータ量には上限がある(約2000文字程度)。
    • パスワードなどの機密情報には絶対に使ってはいけない
    • 結果ページをブックマークしたり、リンクとして共有できる
  • 主な用途:
    • 検索キーワードの送信(Google検索など)。
    • 商品一覧の絞り込み条件や、並び順の指定。

2. POSTメソッド 〜リクエスト本体でデータを送る〜

POSTメソッドは、送信するデータをURLには含めず、HTTPリクエストの本体(ボディ)に入れてサーバーに送る方法です。

POSTの使い方

formタグのmethod属性に"POST"を指定します。

【送信ページ form_post.html

<!DOCTYPE html>
<html lang="ja">
<head><meta charset="UTF-8"><title>POSTフォーム</title></head>
<body>
    <h1>プロフィール登録</h1>
    <form action="receive_post.php" method="POST">
        <p>名前: <input type="text" name="name"></p>
        <p>性別: <input type="radio" name="gender" value="1">男 <input type="radio" name="gender" value="2">女</p>
        <p>一言: <br><textarea name="comment" rows="4" cols="40"></textarea></p>
        <p><input type="submit" value="送信"></p>
    </form>
</body>
</html>

【受信ページ receive_post.php PHPでは、$_POSTというスーパーグローバル変数でデータを受け取ります。

<?php
$name = $_POST['name'] ?? '未入力';
$gender = (int)($_POST['gender'] ?? 0); // (int)で整数に変換
$comment = $_POST['comment'] ?? '';

echo "<p>名前: " . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "</p>";
if ($gender === 1) {
    echo "<p>性別: 男性</p>";
} elseif ($gender === 2) {
    echo "<p>性別: 女性</p>";
}
echo "<p>一言:<br>" . nl2br(htmlspecialchars($comment, ENT_QUOTES, 'UTF-8')) . "</p>";

送信後、URLはhttp://example.com/receive_post.phpのままで、データは外から見えません。

POSTの特徴と主な用途

  • 特徴:
    • 送信データがURLに表示されないため、GETより安全。
    • 送信できるデータ量に事実上上限がない
    • 結果ページをブックマークしても、入力内容は保存されない。
  • 主な用途:
    • ログイン情報(ID、パスワード)の送信。
    • お問い合わせフォームや、会員登録フォーム。
    • ファイルアップロード(後述)。

3. GETとPOSTの比較まとめ

項目GETPOST
データ送信方法URLの末尾に追加HTTPリクエストのボディに含める
データの可視性見える見えない
データ容量制限あり(短い)制限なし(大きい)
ブックマーク可能不可
主な用途検索、フィルタリング登録、更新、ログイン、ファイル送信

使い分けの基本: 検索など、何度実行しても結果が変わらないものはGET。**登録や更新など、サーバー上のデータを変更する可能性のあるものはPOST**と覚えるのが良いでしょう。


4. ファイルアップロード 〜POSTの特別な使い方〜

画像の投稿機能など、ユーザーにファイルをサーバーへ送信してもらう処理は、POSTメソッドの特別な使い方です。

4.1. HTMLフォームの準備

ファイルを送信するフォームには、2つの特別なおまじないが必要です。

  1. method="post": ファイル送信は必ずPOST
  2. enctype="multipart/form-data": ファイルを送信するための特別なエンコード形式を指定。
<h1>画像アップロード</h1>
<form action="upload_receive.php" method="post" enctype="multipart/form-data">
    <p><input type="file" name="upload_image"></p>
    <p><input type="submit" value="アップロード"></p>
</form>

4.2. PHPでの受信と保存

アップロードされたファイルの情報は、$_GET$_POSTではなく、**$_FILES**という専用のスーパーグローバル変数に格納されます。

upload_receive.phpの完成コード】

<?php
$message = '';
// アップロードされたファイルが存在し、エラーがないかを確認
if (isset($_FILES['upload_image']) && $_FILES['upload_image']['error'] === UPLOAD_ERR_OK) {
    $file = $_FILES['upload_image'];
    $upload_dir = './uploads/'; // 保存先ディレクトリ
    
    // ===== バリデーション =====
    // ファイルサイズのチェック (1MB = 1048576 bytes)
    if ($file['size'] > 1048576) {
        $message = 'ファイルサイズが大きすぎます。1MB以下にしてください。';
    // ファイルタイプのチェック
    } elseif (!in_array(exif_imagetype($file['tmp_name']), [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF])) {
        $message = '画像ファイルはJPEG、PNG、GIF形式のみアップロードできます。';
    } else {
        // ===== 安全なファイル名の生成 =====
        $extension = pathinfo($file['name'], PATHINFO_EXTENSION); // ファイルの拡張子を取得
        $unique_name = uniqid(mt_rand(), true) . '.' . $extension; // ユニークなファイル名を生成
        $destination = $upload_dir . $unique_name;

        // ===== ファイルの移動 =====
        // is_uploaded_fileとmove_uploaded_fileで安全にファイルを移動
        if (is_uploaded_file($file['tmp_name']) && move_uploaded_file($file['tmp_name'], $destination)) {
            $message = 'ファイルのアップロードに成功しました。';
            $message .= '<br><img src="' . htmlspecialchars($destination, ENT_QUOTES, 'UTF-8') . '" width="200">';
        } else {
            $message = 'ファイルのアップロードに失敗しました。';
        }
    }
} else {
    $message = 'ファイルが選択されていないか、アップロードでエラーが発生しました。';
}
echo $message;

【処理のポイント】

  1. $_FILES: ファイルはtmp_name(一時的な場所)にまず保存されます。
  2. バリデーション: size(ファイルサイズ)やexif_imagetype(画像形式)をチェックし、不正なファイルを弾きます。
  3. 安全なファイル名: 元のファイル名は危険な場合があるため、uniqid()などでユニークなファイル名を生成するのが定石です。
  4. move_uploaded_file(): 一時ファイルを、uploads/のような公開ディレクトリに移動させて、初めてアップロードが完了します。

php.iniの設定: php.iniファイルのupload_max_filesizeなどの設定値が、アップロードできるファイルの最大サイズを決定します。大きなファイルを扱いたい場合は、この設定の見直しが必要です。


まとめ

  • GET: URLにデータが表示される。検索など、データの取得に使う。
  • POST: URLにデータが表示されない。登録やログインなど、データの送信・変更に使う。
  • ファイルアップロード: enctype属性を指定した特別なPOST。サーバー側での厳格なバリデーションが必須。

これらの使い分けと、それぞれのデータ受信方法($_GET, $_POST, $_FILES)、そしてhtmlspecialchars()によるセキュリティ対策は、PHPでWebアプリケーションを開発する上での根幹となる知識です。各メソッドの特性を理解し、適切な場面で使い分けられるようになりましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次