GETとPOSTの違い|フォーム送信の基本を整理する
- この回の到達目標
- 前回のPHP 3-2とのつながり
- GETとPOSTの違いを先に整理する
- GETはURLにデータを付けて送る
- GETで送った値をPHPで受け取る
- GETではURLも確認してみる
- GETが向いている場面
- POSTはURLにデータを表示せず送る
- POSTで送った値をPHPで受け取る
- POSTではURLに入力内容が表示されない
- POSTなら何でも安全という意味ではない
- GETとPOSTは目的で使い分ける
- LaragonでGETとPOSTを実際に比較する
- 実行結果で見るポイント
$_GETと$_POSTの書き方を比べる- 受け取った値はそのままHTMLへ出さない
- よくあるエラーと確認する場所
- PHP 3-3 学習チェック
- まとめ
- PHP 3章の流れ
この回の到達目標
PHP 3-3では、次の状態を目指します。
- GETとPOSTの大まかな違いを説明できる
- HTMLフォームの
method="get"とmethod="post"の違いが分かる - GETで送られた値を
$_GETで受け取れる - POSTで送られた値を
$_POSTで受け取れる - URLにデータを残したい場面と、残したくない場面をイメージできる
全部を覚える必要はありません。
まずは「送信方法が2種類あり、受け取り方も変わる」と分かれば十分です。
前回のPHP 3-2とのつながり
PHP 3-2では、フォームを次のように作りました。
<form action="result.php" method="post">
<label for="name">名前</label>
<input type="text" id="name" name="name">
<button type="submit">送信する</button>
</form>HTMLここで使っていた、
method="post"
が、今回の主役です。
フォームの method には、代表的な送信方法として、
getpost
があります。
PHP 3-2ではPOSTだけを使いましたが、PHP 3-3ではGETと並べて違いを確認します。
GETとPOSTの違いを先に整理する
最初に、細かなコードを書く前に違いを見てみましょう。
| 比較する項目 | GET | POST |
|---|---|---|
| フォームの指定 | method="get" | method="post" |
| PHPで受け取る | $_GET | $_POST |
| 送ったデータ | URLに付く | URLには表示されない |
| URLの共有 | しやすい | 送信内容はURLに残らない |
| 主な用途 | 検索・絞り込みなど | 問い合わせ・ログインなど |
| データ量 | URLの長さなど実用上の制約を受けやすい | GETより大きなデータを扱いやすい |
ここでは、
GET=URLにデータが付く
POST=URLにはデータが表示されない
という違いを最初に押さえてください。

GETはURLにデータを付けて送る
GETの基本
フォーム:
method="get"
PHP:
$_GET
特徴:
送信したデータがURLに付く
GETを使ったフォームを作ってみます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GETフォーム</title>
</head>
<body>
<h1>GETで名前を送信する</h1>
<form action="get-result.php" method="get">
<label for="get-name">名前</label>
<input type="text" id="get-name" name="name">
<button type="submit">GETで送信する</button>
</form>
</body>
</html>HTMLポイントは、この部分です。
<form action="get-result.php" method="get">HTMLmethod="get" と書くことで、このフォームはGETでデータを送信します。
GETで送った値をPHPで受け取る
GETで送られた値は、PHPの $_GET を使って受け取ります。
<?php
$name = $_GET['name'] ?? '';
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GET送信結果</title>
</head>
<body>
<h1>GET送信結果</h1>
<p>
<?php echo 'こんにちは、' . $safeName . 'さん!'; ?>
</p>
</body>
</html>PHPフォーム側では、
name="name"
と指定しています。
そのためPHP側では、
$_GET['name']
で値を取り出せます。
フォームへ、
Toshi
と入力して送信すると、画面には次のように表示されます。
こんにちは、Toshiさん!PlaintextGETではURLも確認してみる
GETで特に確認してほしいのが、ブラウザのアドレスバーです。
たとえば、
Toshi
と入力すると、URLは次のような形になります。
http://localhost/toshilab-php/php-03-03/get-result.php?name=ToshiPlaintext?name=Toshi がURLへ追加されています。
この、
?name=Toshi
のような部分を、URLのクエリパラメータとして扱います。
初学者の段階では、
GETで送った値はURLから確認できる
と覚えておけば大丈夫です。
日本語や記号をGETで送信すると、URLでは %E3%81... のような文字に変換されて見える場合があります。
これはエラーではありません。
URLで扱える形へ変換されているためです。
GETが向いている場面
GETは、送信した条件をURLとして残せることが特徴です。
たとえば検索画面を想像してみましょう。
PHP
と検索した状態をURLへ残せれば、そのURLをコピーしてもう一度開いたり、他の人へ共有したりできます。
GETは、
- 検索
- 絞り込み
- 並び替え
- ページ番号
- URLとして状態を共有したい処理
などでよく使われます。
POSTはURLにデータを表示せず送る
次はPOSTです。
POSTの基本
フォーム:
method="post"
PHP:
$_POST
特徴:送信した値はURLには表示されない
POSTを使ったフォームを作ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POSTフォーム</title>
</head>
<body>
<h1>POSTで名前を送信する</h1>
<form action="post-result.php" method="post">
<label for="post-name">名前</label>
<input type="text" id="post-name" name="name">
<button type="submit">POSTで送信する</button>
</form>
</body>
</html>PHPPHP 3-2で使った形とほぼ同じです。
違いを確認するため、今回はGET版とPOST版を別々に作ります。
POSTで送った値をPHPで受け取る
POSTで送られた値は $_POST で受け取ります。
<?php
$name = $_POST['name'] ?? '';
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST送信結果</title>
</head>
<body>
<h1>POST送信結果</h1>
<p>
<?php echo 'こんにちは、' . $safeName . 'さん!'; ?>
</p>
</body>
</html>PHPGETでは、
$_GET['name']
でした。
POSTでは、
$_POST['name']
になります。
フォーム側の method と、PHP側で使う変数をセットで確認すると分かりやすくなります。
POSTではURLに入力内容が表示されない
POSTフォームへ、
Toshi
と入力して送信してみます。
表示結果はGETと同じです。
http://localhost/toshilab-php/php-03-03/post-result.phpPlaintextしかし、ブラウザのURLを確認すると、
http://localhost/toshilab-php/php-03-03/post-result.phpPlaintextのように、?name=Toshi は付いていません。
POSTではフォームのデータがHTTPリクエストの本文側へ送られるため、GETのようにURLへ値が表示されません。
この違いが、GETとPOSTを見分ける大きなポイントです。
POSTなら何でも安全という意味ではない
GETとPOSTは目的で使い分ける
ここまでの違いを、もう一度簡単に整理します。
GETを選びやすい場面
検索結果や絞り込み条件のように、
「この状態をURLとして残したい」
場合に向いています。
POSTを選びやすい場面
お問い合わせフォームやログインのように、
「入力内容をURLへ残したくない」
場合に向いています。
また、データを追加・変更する処理では、基本的にGETではなくPOSTなどを使います。
GETとPOSTのどちらが優れている、という話ではありません。
目的によって使い分ける
ことが大切です。
LaragonでGETとPOSTを実際に比較する
今回の練習用フォルダーを作ります。
C:\laragon\www\toshilab-php\php-03-03\
中には次の4ファイルを用意します。
php-03-03/
|
├── get-form.php
|
├── get-result.php
|
├── post-form.php
|
└── post-result.phpPlaintextGETから確認する場合は、ブラウザで次を開きます。
http://localhost/toshilab-php/php-03-03/get-form.php
POSTを確認する場合は、
http://localhost/toshilab-php/php-03-03/post-form.php
を開きます。
それぞれ名前を入力して送信してください。
実行結果で見るポイント
GETとPOSTで、表示されるあいさつ自体は同じです。
違うのは送信の仕方です。
GETでは、
get-result.php?name=Toshi
のようにURLへ値が付きます。
POSTでは、
post-result.php
のままです。
この違いを自分のブラウザで確認できれば、今回の大きな目標は達成です。
$_GET と $_POST の書き方を比べる
GET:
$name = $_GET['name'] ?? '';PHPPOST:
$name = $_POST['name'] ?? '';PHP違うのは、
$_GET$_POST
の部分です。
フォーム側の、
method="get"method="post"
と対応しています。
受け取った値はそのままHTMLへ出さない
GETでもPOSTでも、フォームから送られた値を画面へ表示するときは注意が必要です。
今回も htmlspecialchars() を使っています。
$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');PHPPHP 3-3の段階では、
フォームから受け取った文字をHTMLへ表示するときに必要な処理
として覚えておけば大丈夫です。
詳しいセキュリティについては、今後PHPを進めながら少しずつ確認していきます。
よくあるエラーと確認する場所
1. 入力した文字が表示されない
フォームの name 属性を確認します。
<input type="text" name="name">HTMLこの name="name" と、
$_GET['name']
または、
$_POST['name']
の name が一致している必要があります。
2. GETなのに値を受け取れない
フォームが、
method="get"
なのにPHP側を、
$_POST
にしていないか確認してください。
GETなら $_GET です。
3. POSTなのに値を受け取れない
反対に、
method="post"
ならPHP側も $_POST を使います。
4. 送信ボタンを押すとページが見つからない
action のファイル名を確認します。
GET版なら、
action="get-result.php"
POST版なら、
action="post-result.php"
です。
5. GETで日本語がURL上では読みにくくなった
日本語がURL用に変換されている可能性があります。
これは必ずしもエラーではありません。
まず、結果ページに入力した内容が正常に表示されているか確認してください。
PHP 3-3 学習チェック
次の内容を自分の言葉で確認してみましょう。
- GETでは送信した値がURLに付くことが分かる
- POSTでは送信した値がURLには表示されないことが分かる
- GETは
$_GETで受け取れる - POSTは
$_POSTで受け取れる methodとPHP側の受け取り方を対応させられる- POSTだけで暗号化されるわけではないと分かる
- GETとPOSTを目的によって使い分けるイメージができる
全部暗記できていなくても問題ありません。
GETとPOSTを実際に送信して、URLの違いを自分で確認できたらPHP 3-3はクリアです。
まとめ
PHP 3-3では、フォーム送信で使うGETとPOSTを比較しました。
GETではデータがURLへ付き、PHPでは $_GET で受け取ります。
POSTではデータがURLには表示されず、PHPでは $_POST で受け取ります。
どちらか一方だけを使えばよいのではなく、目的によって使い分けます。
PHP 3-2で「フォームから値を受け取る」ことを学び、PHP 3-3で「送信方法を選ぶ」ところまで進みました。
PR:PHP学習の最初の参考書として、必要な方だけ見てください。
記事内の内容だけでも進められますが、手元に1冊あると、
PHPの基本文法やフォーム処理をまとめて確認しやすくなります。
※価格や在庫、版数は変わるため、最終確認はリンク先でお願いします。
次のPHP 3-4では、ここまでの知識を使って、簡単なお問い合わせフォームの形へつなげていきます。
PHP 3章の流れ
PHP 3章では、配列とフォーム処理を学びます。
- PHP 3-1:PHPのforeach。配列の中身を順番に表示する
- PHP 3-2:PHPフォームの基本。入力した文字を受け取る
- PHP 3-3:GETとPOSTの違い。フォーム送信の基本を整理する
- PHP 3-4:PHPで簡単なお問い合わせフォームの形を作る

