PHP

【PHP入門】GETとPOSTの違いと使い方

PHPでWebアプリケーションを作成しようと思ったら、「ユーザーの入力値を受け取る」という処理が必ず必要になります。

PHPでは入力値を受け取る仕組みとして、$_GET$_POSTという変数があらかじめ用意されています。

この記事では、$_GETと$_POSTの使い方を詳しく解説していきたいと思います。

GETとPOSTとは?

PHPでの使い方の話に入る前に、そもそもGETとPOSTとは何か?という事について軽く触れておきます。

GETとPOSTは、Webサイトを閲覧する際にいつも利用しているHTTPという通信プロトコルで使用されるメソッドの一種です。

メソッドとは通信の方法のようなもので、簡単に説明すると、GET=データを取得するPOST=データを送信する、という意味になります。

PHPでの利用

そしてGETやPOSTの内容をPHPで受け取る仕組みが用意されており、それが$_GET、$_POSTという変数です。

これらは「定義済の変数」と呼ばれ、PHP側であらかじめ定義されている変数になります。詳しくはマニュアルを参照してみてください。

http://php.net/manual/ja/reserved.variables.php

GETとPOSTの違い

上にも書きましたが、GET=取得する、POST=送信する、です。

こう書くと単純ですが、これはあくまでリクエストを投げる側(クライアント側)から見た動作で、PHP(サーバー側)としては、GETだろうがPOSTだろうが、リクエストに対する応答を返す必要があります。

GETとPOSTの動作イメージ

また、GETは取得する動作ですが、場合によっては「どういうデータが欲しいのか?」という情報を付与する必要があります。この付与された情報を受け取るという行為が、POSTで送信されたデータを受け取る行為とよく似ているため、初心者はよくGETとPOSTを混同しがちです。

ただその使い方には明確な違いがあります。
具体的には、

  • GETはURLにパラメータを付与する
  • POSTはURL上からは見えないデータを送信する

という違いです。

GETはURLだけで指定できるので、URLさえ知っていればブラウザに打ち込むだけで目的のページにアクセスできます。(ブックマークできる)
一方POSTは、URLには付与されないデータなので、特定のページから何らかのアクションをしないと遷移できません。(ログイン、データ登録など)

GETの特徴

  • 主にデータの取得に用いる
  • URLにパラメータを付与する
  • 長いデータの送信には向かない
  • 他人に見られたくない情報は載せない方が良い
  • テキストデータのみ

POSTの特徴

  • 主にデータの送信に用いる
  • URLからは見えないデータを送信する
  • 長いデータの送信に向いている
  • 他人に見られたくない情報(パスワードなど)を送信する場合に向いている
  • バイナリデータ(ファイルなど)も送信できる

GETの使い方

ここからは、実際の使い方を解説します。まずはGETです。

GETはURLに付与すると書きましたが、具体的には以下のように指定します。

https://kyo-blog.com/test.php?param1=aaa&param2=bbb

test.phpまでが、元のURLです。これに「?」を付与して、それ以降に「名前=値」という形式でパラメータを記述します。また、「&」で繋げることで、複数指定することが可能です。

これを、PHP側では以下のように取り出します。

<?php

$param1 = $_GET['param1'];
$param2 = $_GET['param2'];

GETで付与したパラメータは、$_GETという変数に格納されます。
$_GETは連想配列になっており、URLに指定した名前が配列のキーになっています。

上記の例の場合、$param1には「aaa」という文字列が、$param2には「bbb」という文字列が、それぞれ格納されます。

GETの具体例

GETの具体的な使い方をいくつか挙げてみます。

  • detail.php?id=1 のように指定して、商品詳細ページを表示する
  • search.php?keyword=hoge のように指定して、検索結果を取得する
  • list.php?page=2 のように指定して、ページ移動を行う

いずれも、データを「取得する」目的で使用していますね。

POSTの使い方

次にPOSTの解説です。

POSTの送信方法は色々ありますが、最も一般的なのは、HTMLのformタグで送信する方法です。

<form name="test_form" action="test.php" method="POST">
  <input type="text" name="param1" value="aaa">
  <input type="text" name="param2" value="bbb">
  <input type="submit" value="送信">
</form>

HTMLでこのように記述していたとすると、送信ボタンを押下することで、test.phpにフォームに入力した内容を送信することができます。

ポイントはformタグの記述です。actionに送信先を指定し、methodに送信方法を指定します。method=”POST”とすることでPOSTの送信となりますが、これはGETにすることもできます。GETにした場合は、フォームに入力した内容がURLに付与されて送信されます。

PHP側では以下のように取り出します。

<?php

$param1 = $_POST['param1'];
$param2 = $_POST['param2'];

GETとほぼ同じですね。$_GETだった部分が、$_POSTに変わるだけです。

POSTの具体例

POSTの具体的な使い方をいくつか挙げてみます。

  • ログインフォーム
  • お問い合わせフォーム
  • 記事の投稿
  • コメントの投稿
  • データの登録・編集

いずれも、データを「送信する」目的で使用していると思います。

$_REQUESTについて

もう1点、PHPの「定義済の変数」の一つである、$_REQUESTについても触れておきます。

$_REQUESTは、$_GETと$_POSTの両方がひとまとめになって格納されている変数です。(それに加えて$_COOKIEも格納されていますが、ここでは割愛します。)

つまり、$_GETや$_POSTは$_REQUESTに置き換えても同じ動作となります。

<?php

// 以下の2行は同じ
$param1 = $_GET['param1'];
$param1 = $_REQUEST['param1'];

// 以下の2行は同じ
$param2 = $_POST['param2'];
$param2 = $_REQUEST['param2'];

なら、$_REQUESTだけ使った方が楽なんじゃ?と思われるかもしれませんが、$_REQUESTの使用はあまり推奨しません。

確かに楽ではあります。が、それよりも遥かにデメリットの方が大きいからです。

例えばログイン処理で$_REQUESTを使ったらどうなると思いますか?
本来フォームに入力して送信するIDやパスワードを、URLに付与することでもログインできるようになってしまいますよね。
それがセキュリティ的に非常に良くないということは、なんとなく想像が付くと思います。

このように、$_REQUESTは開発者の意図しない動作を引き起こす要因となりやすいというのが、使用をオススメできない理由です。

もちろん、万全のセキュリティ対策をしたうえで、その特性を理解して使う分には問題ないと思いますが、どんな優秀な開発者でも見落としはありますので、基本的には使用しない方が安全かと思います。

まとめ

GETとPOSTについて、概要をまとめます。

GETとPOSTのまとめ

  • GETは主に取得に使う、URLにパラメータを付与する
  • POSTは主に送信に使う、見えないデータを送る
  • $_REQUESTは使用すべきではない

GETとPOSTを理解することは、PHP入門の第1歩です。
今後ずっと使っていくことになると思いますので、是非マスターしてください。