PHP
PR

GETとPOSTの違い|フォーム送信の基本を整理する

GETとPOSTの違いを、フォーム送信のイメージとURL表示の違いで分かりやすく表したPHP 3-3のアイキャッチ画像
toshi
記事内に商品プロモーションを含む場合があります

この記事は、PHPのフォーム送信で使う GETとPOSTの違いを、初学者向けに整理する記事です。

前回のPHP 3-2では、HTMLフォームへ入力した文字をPOSTで送信し、PHPの $_POST で受け取るところまで確認しました。

今回は少し視野を広げて、フォームにはPOSTだけでなくGETという送信方法もあることを確認します。

大切なのは、最初から細かな仕組みを暗記することではありません。

「GETではURLにデータが見える」「POSTではURLにデータが見えない」

まずは、この違いを実際に動かしながら確認していきます。

この回の到達目標

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の違いを先に整理する

最初に、細かなコードを書く前に違いを見てみましょう。

比較する項目GETPOST
フォームの指定method="get"method="post"
PHPで受け取る$_GET$_POST
送ったデータURLに付くURLには表示されない
URLの共有しやすい送信内容はURLに残らない
主な用途検索・絞り込みなど問い合わせ・ログインなど
データ量URLの長さなど実用上の制約を受けやすいGETより大きなデータを扱いやすい

ここでは、

GET=URLにデータが付く

POST=URLにはデータが表示されない

という違いを最初に押さえてください。

GETとPOSTの違いを、URL表示、送信方法、受け取る変数、使いどころで比較した説明画像
GETと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">
HTML

method="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さん!
Plaintext

GETではURLも確認してみる

GETで特に確認してほしいのが、ブラウザのアドレスバーです。

たとえば、

Toshi

と入力すると、URLは次のような形になります。

http://localhost/toshilab-php/php-03-03/get-result.php?name=Toshi
Plaintext

?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>
PHP

PHP 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>
PHP

GETでは、

$_GET['name']

でした。

POSTでは、

$_POST['name']

になります。

フォーム側の method と、PHP側で使う変数をセットで確認すると分かりやすくなります。

POSTではURLに入力内容が表示されない

POSTフォームへ、

Toshi

と入力して送信してみます。

表示結果はGETと同じです。

http://localhost/toshilab-php/php-03-03/post-result.php
Plaintext

しかし、ブラウザのURLを確認すると、

http://localhost/toshilab-php/php-03-03/post-result.php
Plaintext

のように、?name=Toshi は付いていません。

POSTではフォームのデータがHTTPリクエストの本文側へ送られるため、GETのようにURLへ値が表示されません。

この違いが、GETとPOSTを見分ける大きなポイントです。

POSTなら何でも安全という意味ではない

ここはとても大切です。

POSTを使っただけで、データが暗号化されるわけではありません。


POSTはGETと違い、送信した値がURLへ表示されません。

しかし、パスワードや個人情報などを安全に送信するには、
サイト側で HTTPS を利用することも重要です。


「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.php
Plaintext

GETから確認する場合は、ブラウザで次を開きます。

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'] ?? '';
PHP

POST:

$name = $_POST['name'] ?? '';
PHP

違うのは、

$_GET$_POST

の部分です。

フォーム側の、

method="get"method="post"

と対応しています。

受け取った値はそのままHTMLへ出さない

GETでもPOSTでも、フォームから送られた値を画面へ表示するときは注意が必要です。

今回も htmlspecialchars() を使っています。

$safeName = htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
PHP

PHP 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で簡単なお問い合わせフォームの形を作る

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
toshi
toshi
フルスタックエンジニア
C型肝炎や感染症の闘病を経て現在通院中
フリーランスとして今日を生きる、それがすべて。
静かな光の中で、歩みを止めずに生きていく。
実験大好きなので色々とやっていきます。
記事URLをコピーしました