10日で覚えるPHPのキソ 第 8 回 データの受け取り(POSTとGET)
第 8 回は、POSTとGETという方法を使ったデータの受け取りについてお話します。
申込みフォームなど、Webページからデータを入力するページがありますよね?
今回はその仕組みについてお話いたします。
例えば、以下のような名前とブログ名を入れるフォームがあります。
入力して送信ボタンをクリックすると以下のように表示されます。
(○○や△△は入力した文字列です。)
これらはどのように送信されているのでしょうか?
ではまず、データ送信の方法についてお話します。
POSTとGET
WebブラウザからPHPへのデータ送信方法のうち、代表的なものは以下の2種類です。
- POST
- GET
form要素(<form>タグ)のmethod属性がPOST
form要素(<form>タグ)のmethod属性がGET
PHPプログラムでデータを受け取る変数(配列)は以下の通りです。
- $_POST
- $_GET
$_POSTは、POST形式のHTMLフォームから入力された情報(ポストデータ)を取得するための「スーパーグローバル変数」と呼ばれる定義済みの連想配列です。
個々の要素にアクセスするには$_POST['input要素(<input>タグ)のname属性']のようにします。
$_GETは、GET形式のHTMLフォームから入力された情報を取得するためのスーパーグローバル変数です。
$_GETも連想配列の形になっています。
個々の要素にアクセスするには$_GET['input要素(<input>タグ)のname属性']のようにします。
それぞれの違いについて見ていきましょう。
POST
以下のような、名前を入力して送信するフォームを作ってみましょう。
ではまず入力する側から。ファイル名は、「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に遷移するとブラウザに以下のような表示が出ます。
それではデータの受取側の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."です。";
?>
上記のフォームを作成して、データを入力して送信してみましょう。
入力して、送信ボタンをクリックすると…
お名前はichikawaで、ブログ名はバシャログです。
■ 用語集
■ 参考サイト・文献