GETとPOSTの違い
そふぃのPHP入門 >> PHP実践リファレンス >> $_GETと$_POST >> GETとPOSTの違い

GETとPOSTの違い

ページのリクエストについて

$_GET$_POSTがフォームからの値を格納してくれる変数だというのは前回「外部からの変数:$_GETと$_POST」お話しましたが、今回はその$_GET$_POSTの違いについて少し触れていきたいと思います。

まず、POST要求を出すためにはフォーム内で明示的に宣言する必要があります。これ以外の要求はすべてGET要求となり、フォームでmethod属性を指定し忘れた場合なんかもGET要求になります。

いろいろ説明する前に「要求」ってものについて少し触れておきます。通常、ホームページを見る場合はページのハイパーリンクをクリック、クリック、などして色々なページにジャンプしていくと思うのですが、この動作も実は「要求」です。どんな「要求」かというと、Webサーバに「このページを見せて下さい」と要求しているわけです。つまり、「このページを見せて下さい」という要求がハイパーリンクをクリックするたびに行われているって事になります。

さて、ハイパーリンクをクリックした場合の「要求」っていうのも実はGET要求です。こういったサーバなどに対する「要求」というのは「リクエスト」と言われますので覚えて下さい。

試しにこのページにはどんな要求(リクエスト)でいらっしゃったかを出力してみます。ちょうどサーバ変数にページがリクエストされた時のリクエストメソッドを取得する変数があるのでそれを使います。「リクエストメソッド」・・・は、今までの解説の流れで何となく分かりますよねw。どのメソッド(GETかPOST)でページがリクエスト(要求)されたかです。

リクエストメソッドを取得するサーバ変数は$_SERVER['REQUEST_METHOD']ですので、それを出力します。

  1. <?php
  2. echo $_SERVER['REQUEST_METHOD'];
  3. ?>

出力結果

GET

さて、どんなメソッドでこのページに来ているかお分かりになったでしょうか。フォーム内で明示的にPOSTを宣言しない限りGETリクエストになる、と説明しましたが通常GETリクエストというものは意識しないだけで頻繁に行われています。

GETとPOSTの違い

GETとPOSTの違いはデータの送信方法です。この送信方法が実はまるで違うのですが、最初のうちはそういった内部的な動きまでは知る必要はありません。覚えて欲しいのは、以下の点になります。

  1. フォーム内で明示的に宣言しない限りはGETリクエストとなる
  2. GETの場合は送信内容がURLとして渡される
  3. GETには送信できる情報量に制限がある
  4. GETでは日本語などの全角文字を送信できない

以上の点になります。???となると思うので順番に解説していきます。

まず、1番については上記で触れていますのでいいとして・・・・2番の送信内容がURLとして渡されるってところですが、これは実際に見たほうが早いです。前回「外部からの変数:$_GETと$_POST」で簡単な送信ボタンをPOSTメソッドを使用して作りましたが、それをGETで作り変えて下さい。前回のページを見てない人のためにサンプルです。

<form action="" method="get">
  <input type="submit" name="sub" value="GO" />
</form>

このボタンの値を出力するためのPHPスクリプトは以下です。

  1. <?php
  2. echo $_GET["sub"];
  3. ?>

出力結果

ここでもまだリクエストが発生してないので$_GET['sub']には値が格納されてません。リクエストを発生させるためには以下のボタンをクリックして下さい。

クリックすると出力結果の欄に値が表示されたと思いますが、前回「外部からの変数:$_GETと$_POST」でやったPOST要求と何が違うか分からないかもしれません。ブラウザでURLが表示されるアドレスバーを見て下さい。

アドレスバーの表示方法(IE):ブラウザ上部のメニュより「表示」→「ツールバー」とすると「アドレスバー」という項目があるので、その項目にチェックする。

アドレスバーのURLの後に

?sub=GO

という文字があると思いますが、それがURL送信です。GET要求ではこのようにURLに「クエリ」という形でデータを引っ付けて送信されます。引っ付けかたは簡単で、"?"の後に「name値=value値」のようにして渡します。渡したい値が複数ある場合は"&"で繋げます。つまり、フォーム部品が複数あった場合の指定方法は以下のようになります。

?sub1=GO1&sub2=GO2&sub3=GO3

このようにURLにおまけデータのような形で送信されるため、GETには送信できる情報量に制限があります。これがGETとPOSTの違いの3番になる訳ですが、どの程度まで送信できるかはサーバの設定に依存します。通常は大したサイズは送れないでたくさんのデータを送りたい時はPOSTを使用します。だからといってPOSTが無限にデータを送れる訳ではありませんが、GETは少量のデータしか送信できない、と覚えておいて下さい。

また、GETだとURLに直接値を入力する事によってクエリの操作ができます。試しにURLのGOの部分を適当に変えて送信してみてください。$_GET["sub"]の出力結果欄に入力した値が表示されます。但し、日本語を直接入力するとおかしな表示になります。
あまり長い入力値は受け付けないようにしてありますのでこのサイトでテストするなら短めの文字でお願いします。

URLでデータの操作ができてしまうのはセキュリティ上は非常に危険な場合があります。フォーム画面を開いて送信しなくてもURLでどんどんデータが送れてしまうという事なので、悪意のあるユーザのいたずら対象になりかねません。URLでデータが送られたら困るような場合もやっぱりPOSTを使用します。

日本語が文字化けするのはGETとPOSTの違いの4番に絡んできますが、このページがだいぶ長くなってきましたのでその部分の解説は次のページで行います。