Webサイトがユーザーと対話するために欠かせないHTMLフォーム。検索キーワード、ログイン情報、お問い合わせ内容など、ユーザーが入力したデータをサーバーに送信するには、いくつかの「送信方法(メソッド)」があります。
その中でも特に重要なのがGET
とPOST
です。この2つは似ているようで、その特性や使われるべき場面が全く異なります。
この記事では、GET
とPOST
の基本的な使い方と明確な違い、さらには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
より安全。 - 送信できるデータ量に事実上上限がない。
- 結果ページをブックマークしても、入力内容は保存されない。
- 送信データがURLに表示されないため、
- 主な用途:
- ログイン情報(ID、パスワード)の送信。
- お問い合わせフォームや、会員登録フォーム。
- ファイルアップロード(後述)。
3. GETとPOSTの比較まとめ
項目 | GET | POST |
データ送信方法 | URLの末尾に追加 | HTTPリクエストのボディに含める |
データの可視性 | 見える | 見えない |
データ容量 | 制限あり(短い) | 制限なし(大きい) |
ブックマーク | 可能 | 不可 |
主な用途 | 検索、フィルタリング | 登録、更新、ログイン、ファイル送信 |
使い分けの基本: 検索など、何度実行しても結果が変わらないものはGET
。**登録や更新など、サーバー上のデータを変更する可能性のあるものはPOST
**と覚えるのが良いでしょう。
4. ファイルアップロード 〜POSTの特別な使い方〜
画像の投稿機能など、ユーザーにファイルをサーバーへ送信してもらう処理は、POST
メソッドの特別な使い方です。
4.1. HTMLフォームの準備
ファイルを送信するフォームには、2つの特別なおまじないが必要です。
method="post"
: ファイル送信は必ずPOST
。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;
【処理のポイント】
$_FILES
: ファイルはtmp_name
(一時的な場所)にまず保存されます。- バリデーション:
size
(ファイルサイズ)やexif_imagetype
(画像形式)をチェックし、不正なファイルを弾きます。 - 安全なファイル名: 元のファイル名は危険な場合があるため、
uniqid()
などでユニークなファイル名を生成するのが定石です。 move_uploaded_file()
: 一時ファイルを、uploads/
のような公開ディレクトリに移動させて、初めてアップロードが完了します。
php.iniの設定:
php.ini
ファイルのupload_max_filesize
などの設定値が、アップロードできるファイルの最大サイズを決定します。大きなファイルを扱いたい場合は、この設定の見直しが必要です。
まとめ
- GET: URLにデータが表示される。検索など、データの取得に使う。
- POST: URLにデータが表示されない。登録やログインなど、データの送信・変更に使う。
- ファイルアップロード:
enctype
属性を指定した特別なPOST。サーバー側での厳格なバリデーションが必須。
これらの使い分けと、それぞれのデータ受信方法($_GET
, $_POST
, $_FILES
)、そしてhtmlspecialchars()
によるセキュリティ対策は、PHPでWebアプリケーションを開発する上での根幹となる知識です。各メソッドの特性を理解し、適切な場面で使い分けられるようになりましょう。