PHP で Web アプリケーションを作成して、GET メソッドと POST メソッドに関して色々調べたのでまとめていきます。
GET と POST とは?
一言で言うと、Web サーバへデータを渡す際のリクエストの方式です。
Web ブラウザから Web ページや Web アプリケーションを使う際に、サーバとブラウザ間では毎回リクエスト(要求)とレスポンス(応答)が行われています。
リクエストを行う方法として、
- 入力フォームに情報を入力して送信ボタンを押す
- ページ内のリンクをクリックする
- ブックマークからアクセスする
- ブラウザのアドレス欄に URL を入力する
以上のような方法があります。
サーバ側では、このようなリクエストを受け取って該当のページを出力することで、私達のブラウザ上にページが表示される流れになります。
リクエストパラメータ
Web サーバと Web ブラウザ間では、リクエストとレスポンスが行われていると言いましたが、その際にデータを渡したい場合があります。
例えば、
- ユーザー名やパスワードを入力して送信
- 検索ボックスから検索したいデータを送信
- 一覧画面から次のページを表示する際のページ番号
などがあります。
このような、Web サーバへ送信するデータのことをリクエストパラメータと言います。
GET と POST はこのリクエストパラメータの送信方法の違いになります。
GET
GET 方式の一番の特徴は、URL の末尾にパラメータをくっつけて送信していることです。
Google の検索フォームで「GET とは?」と検索してみると、検索結果のアドレス欄は下の画像のような表示になっています。
この?
以降の文字列が GET で送信しているパラメータになります。
「p=GET とは?」というパラメータですが、「p」 がkeyでイコールの後 「GET とは?」が value になります。複数のパラメータを渡したい場合は値を&(アンパサンド)で連結させます。
このパラメータ付きの URL をお気に入りなどに保存しておけば、その URL をクリックしただけで検索結果を表示することができます。
URL にパラメーターを付与しているので、送信しているデータが丸見なのがわかると思います。なので、ユーザー名やパスワードを送信することには向いていません。
文字数制限
GET リクエストは一部のブラウザまたはサーバーで長さ制限が設けられているため、大量のデータを送信するのには向いません。
[tech]HTTP GET メソッドの URI の長さ制限を調べてみた
Web サーバ側でも長さ制限を指定できるようです。Apache2.4 のデフォルトは 8190bytes となっています。
GET の使い方
GET は、html の form タグの method 属性にgetと記述することで使用することができます。(GET メソッド)
<form method="get" action="mypage.php">
<input type="text" name="name">
<button class="btn btn-primary" type="submit">送信</button>
</form>
サンプルプログラムを実行して動作を確認してみます。
テキストボックスに適当な文字列を入力し送信ボタンを押します。
mypage.php
に移動した際のパラメーターを確認してみると、「?」以降に、input 要素の name 属性で指定したキーワードが key に、テキストボックスで入力した値が value の形式で渡ってきています。
PHP では送られたパラメータは標準の変数に格納されるので、そこから取得することが可能です。
- $_GET:get パラメータが格納されている変数
- $_POST:post パラメー タが格納されている変数
- $_REQUEST:get、post パラメータ両方が格納されている変数
mypage.php
側のファイルで GET メソッドから渡ってきたデータを確認してみます。
<?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 メソッド)
<form method="post" action="mypage.php">
<input type="text" name="name">
<button class="btn btn-primary" type="submit">送信</button>
</form>
GET メソッドで確認したときと同様に、渡ってきたデータを確認してみます。POST メソッドで送信されたデータは$_POST 変数に格納されています。
<?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 よりセキュリティ面で優れている
- 文字数制限がない