PHPでのGETとPOSTの使い分けについて

PHPでのGETとPOSTの使い分けについて

PHP で Web アプリケーションを作成して、GET メソッドと POST メソッドに関して色々調べたのでまとめていきます。

GET と POST とは?

一言で言うと、Web サーバへデータを渡す際のリクエストの方式です。

Web ブラウザから Web ページや Web アプリケーションを使う際に、サーバとブラウザ間では毎回リクエスト(要求)とレスポンス(応答)が行われています。

リクエストを行う方法として、

  • 入力フォームに情報を入力して送信ボタンを押す
  • ページ内のリンクをクリックする
  • ブックマークからアクセスする
  • ブラウザのアドレス欄に URL を入力する

以上のような方法があります。

サーバ側では、このようなリクエストを受け取って該当のページを出力することで、私達のブラウザ上にページが表示される流れになります。

リクエストパラメータ

Web サーバと Web ブラウザ間では、リクエストとレスポンスが行われていると言いましたが、その際にデータを渡したい場合があります。

例えば、

  • ユーザー名やパスワードを入力して送信
  • 検索ボックスから検索したいデータを送信
  • 一覧画面から次のページを表示する際のページ番号

などがあります。

このような、Web サーバへ送信するデータのことをリクエストパラメータと言います。

GET と POST はこのリクエストパラメータの送信方法の違いになります。

GET

GET 方式の一番の特徴は、URL の末尾にパラメータをくっつけて送信していることです。

Google の検索フォームで「GET とは?」と検索してみると、検索結果のアドレス欄は下の画像のような表示になっています。

Google検索結果のURLパラメータの例

この?以降の文字列が GET で送信しているパラメータになります。

「p=GET とは?」というパラメータですが、「p」 がkeyでイコールの後 「GET とは?」が value になります。複数のパラメータを渡したい場合は値を&(アンパサンド)で連結させます。

このパラメータ付きの URL をお気に入りなどに保存しておけば、その URL をクリックしただけで検索結果を表示することができます。

URL にパラメーターを付与しているので、送信しているデータが丸見なのがわかると思います。なので、ユーザー名やパスワードを送信することには向いていません。

文字数制限

GET リクエストは一部のブラウザまたはサーバーで長さ制限が設けられているため、大量のデータを送信するのには向いません。

[tech]HTTP GET メソッドの URI の長さ制限を調べてみた

Web サーバ側でも長さ制限を指定できるようです。Apache2.4 のデフォルトは 8190bytes となっています。

URL の最大長は何文字?(クエリ文字列含めて)

GET の使い方

GET は、html の form タグの method 属性にgetと記述することで使用することができます。(GET メソッド)

"index.php"
<form method="get" action="mypage.php">
  <input type="text" name="name">
  <button class="btn btn-primary" type="submit">送信</button>
</form>

サンプルプログラムを実行して動作を確認してみます。

テキストボックスに適当な文字列を入力し送信ボタンを押します。

getメソッド

mypage.phpに移動した際のパラメーターを確認してみると、「?」以降に、input 要素の name 属性で指定したキーワードが key に、テキストボックスで入力した値が value の形式で渡ってきています。

urlパラメータ

PHP では送られたパラメータは標準の変数に格納されるので、そこから取得することが可能です。

  • $_GET:get パラメータが格納されている変数
  • $_POST:post パラメータが格納されている変数
  • $_REQUEST:get、post パラメータ両方が格納されている変数

mypage.php側のファイルで GET メソッドから渡ってきたデータを確認してみます。

"mypage.php"
<?php

var_dump($_GET);

?>

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
// 以下略

連想配列の形で渡ってきているのが分かります。

// 出力結果
array(1) { ["name"]=> string(4) "test" }

POST

POST 方式でデータを渡す場合は、GET とは違い URL のパラメータは変わりません。POST では HTTP 通信のリクエストメッセージボディに格納されて送信されます。

ブラウザの開発ツールなどを使えば送信したデータを見ることが可能ですが、調べることをしない限り POST メソッドで送信されたリクエストパラメータがユーザーに見えることはありません。

また、GET 方式のように URL にパラメーターを付与しないので文字数を気にせず送信することが可能です。

POST の使い方

POST の使い方も、html の form タグの method 属性にpostと記述することで使用することができます。(POST メソッド)

"index.php"
<form method="post" action="mypage.php">
  <input type="text" name="name">
  <button class="btn btn-primary" type="submit">送信</button>
</form>

GET メソッドで確認したときと同様に、渡ってきたデータを確認してみます。POST メソッドで送信されたデータは$_POST 変数に格納されています。

"mypage.php"
<?php

var_dump($_POST);

?>

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
// 以下略

連想配列の形で渡ってきているのが分かります。

// 出力結果
array(1) { ["name"]=> string(4) "test" }

GET と POST の使い分け

GET と POST の使い分けですが、基本的に情報の取得系は GET、情報の登録系は POST を使うと覚えておけば良いでしょう。

機能メソッド
お問い合わせフォームPOST
検索フォームGET
ログイン機能POST
ユーザー登録機能POST
ページネーション機能GET

まとめ

GET の特徴

  • URL にパラメータが付与される
  • そのパラメータ付きの URL を保存、編集できる
  • 文字数制限がある

POST の特徴

  • リクエストパラメータは HTTP リクエストのボディ部に記述されている
  • GET よりセキュリティ面で優れている
  • 文字数制限がない

参考記事