10日で覚えるPHPのキソ 第 8 回 データの受け取り(POSTとGET)

No Photo

第 8 回は、POSTとGETという方法を使ったデータの受け取りについてお話します。
申込みフォームなど、Webページからデータを入力するページがありますよね?
今回はその仕組みについてお話いたします。

例えば、以下のような名前とブログ名を入れるフォームがあります。

080515_ichikawa_php08_01.jpg

入力して送信ボタンをクリックすると以下のように表示されます。
(○○や△△は入力した文字列です。)

080515_ichikawa_php08_05.jpg

これらはどのように送信されているのでしょうか?

ではまず、データ送信の方法についてお話します。

POSTとGET

WebブラウザからPHPへのデータ送信方法のうち、代表的なものは以下の2種類です。

  • POST
  • form要素(<form>タグ)のmethod属性がPOST

  • GET
  • form要素(<form>タグ)のmethod属性がGET

PHPプログラムでデータを受け取る変数(配列)は以下の通りです。

  • $_POST
  • $_POSTは、POST形式のHTMLフォームから入力された情報(ポストデータ)を取得するための「スーパーグローバル変数」と呼ばれる定義済みの連想配列です。
    個々の要素にアクセスするには$_POST['input要素(<input>タグ)のname属性']のようにします。

  • $_GET
  • $_GETは、GET形式のHTMLフォームから入力された情報を取得するためのスーパーグローバル変数です。
    $_GETも連想配列の形になっています。
    個々の要素にアクセスするには$_GET['input要素(<input>タグ)のname属性']のようにします。

それぞれの違いについて見ていきましょう。

POST

以下のような、名前を入力して送信するフォームを作ってみましょう。

080515_ichikawa_php08_03.jpg

ではまず入力する側から。ファイル名は、「form.html」です。

  • post.html

入力フォームのソースは以下の通りです。
(この入力側のフォームではPHPプログラムを含まないので拡張子はphpではなくhtmlです。)

<form action="post.php" method="post">
    お名前  :  <input type="text" name="name" /><br />
    <input type="submit" name="submit" value="送信する" />
</form>

入力ページから送信ボタンをクリックすると、表示画面に遷移します。
遷移先のページのファイル名を、「action = "遷移するファイル名"」として指定します。

POSTで送信する時は、method属性を「method="post"」とします。
input要素(<input>タグ)のname属性で指定した名前(ここではname)が、受け取る時の$_POSTの添字となります。

次に、データを受け取る側のPHPプログラムを作ります。
ファイル名はpost.phpです。

名前の入力欄に「ichikawa」と入力して送信ボタンをクリックし、post.phpに遷移するとブラウザに以下のような表示が出ます。

080515_ichikawa_php08_04.jpg

それではデータの受取側のPHPのプログラムを書いてみましょう。

  • post.php
<?php
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
echo "入力したお名前は".$name."ですね";
?>

POSTで送信する場合、Webブラウザの入力データはHTTPヘッダの後ろに記載されてApache(Webサーバー)へと送られます。
「method="post"」で送信したデータをPHPプログラムで受け取る場合に使う変数(配列)は、$_POSTです。
この$_POSTは、スーパーグローバル変数と呼ばれる連想配列です。
要素名は$_POST['input属性で指定した名前']となります。

今回の場合、受け取る「名前のテキストボックスに入力したデータ」の要素名は以下のようになります。
$_POST['name']

(htmlspecialcharsは内部関数です。ここではセキュリティのために受け取ったデータを安全な形に変えてから、変数$nameに代入しています。ENT_QUOTESは、第2引数です。詳細はマニュアルをご覧下さい。

それでは、入力フォームのmethod属性を「GET」に変更してみます。
どのようになるでしょうか?

GET

  • get.html
<form action="post.php" method="get">
    お名前  :  <input type="text" name="name" /><br />
    <input type="submit" name="submit" value="送信する" />
</form>
  • get.php
<?php
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
echo "入力したお名前は".$name."ですね";
?>

表示されている様子は、POSTもGET変わりませんね。

ただ、get.phpに遷移したあとのURLを見てください。

http://icikawa….c-brains.co.jp/get.php?name=ichikawa&submit=%E9%8…

このように、GETで送信する場合、送信データはURLのファイル名(今回はget.php)の後ろに付加されます。
POSTデータと同様、PHPでデータを受け取った時には「$_GET」というスーパーグローバル変数に格納されます。

GET方式でデータを受け取った場合も、POST方式でデータを受け取った場合も、PHP側では変数の名前が異なる以外には違いはありません。

POSTとGETの使い分け

  • サーバーからなにか情報を取り出す時はGET
  • サーバーに情報を投稿するときにつかう時はPOST
  • サーバー内のデータをユーザーが書き換える場合はPOST
  • GETは送信できるデータの長さに制限がある
  • ファイルのアップロードなどは、POSTでしか行えない処理
  • GETは、送るデータはURLの一部になるのでブックマーク、アンカーによるリンクが可能
<a href = "http:// ….c-brains.co.jp/link.php?method=get">リンク先</a>

それでは簡単なアンケートフォームを作ってみましょう。

第 8 回まとめ アンケートフォームを作ってみる

  • form.html
<form action="form.php" method="post">
    お名前 : <input type="text" name="name" /><br />
    Blog : <input type="text" name="blog" /><br />
    <input type="submit" name="submit" value="送信する" />
</form>
  • form.php
<?php
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
$blog = htmlspecialchars($_POST['blog'], ENT_QUOTES);

echo "お名前は".$name."で、ブログ名は".$blog."です。";
?>

上記のフォームを作成して、データを入力して送信してみましょう。

080515_ichikawa_php08_02.jpg

入力して、送信ボタンをクリックすると…

お名前はichikawaで、ブログ名はバシャログです。

■ 用語集

■ 参考サイト・文献

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ