値の受け渡し
クライアント(ブラウザ)側からするとリクエストを送信しレスポンスを得る、ウェブサーバ側からするとリクエストを受けてレスポンスを返す、といういたって簡単な仕組みで HTTP通信は成り立っています。この中で PHP が担っているのは、ウェブサーバが受けたリクエストに応じてサーバの資源や情報を適切な形に加工することです。
では、どのようなリクエスト方法があってどうすれば PHP で利用できるか、クライアント→PHP の値の受け渡し方法を見てみたいと思います。
GET リクエスト
URL だけを使ったリクエスト方法です。シンプルに値を送信できますが、実質文字数に限り(2000バイト程度まで)があるので、比較的情報量が少ない単純な値を送信するの適しています。
GET リクエストを送信する
一番なじみがあるのはアンカータグでしょう。ブラウザのURL欄に直接URLを入力するのと同じ事です。
<a href="http://xxxxxxx/index.php?user=Yuji&age=20">Click</a>
この URL では「 /index.php 」がリクエストされているので index.php が実行され、その出力をブラウザに返すことになります。
index.php 以降の文字は 「 Query strings(クエリストリングス)」と呼ばれるもので、リクエストの追加情報にあたります。
「?」は、これ以降がクエリストリングスであることを示すお約束です。必ず 名前=値の書式をしていてこれを「URLパラメータ」や単に「パラメータ」と呼びます。「user=Yuji」は、「 パラメータ名 user の値が Yuji である 」ということをあらわしています。age=20 も同じことです。 パラメータがいくつもある時は「&」で区切ります。
GET リクエストのパラメータを得る
PHP にはこの値を得るためのスーパーグローバル変数「 $_GET 」が用意されています。
$_GET は配列の形を取っていて、$_GET に続く添え字がパラメータ名に対応していますので、$_GET['user'] という書式で値の Yuji を得ることが出来ます。
例1)index.php
<?php echo $_GET['user']; // この値は'Yuji'。 // リクエストパラメータの user=Yuji に対応。 echo $_GET['age']; // この値は'20'。 // リクエストパラメータの age=20 に対応。 ?>
例1を実行しても Yuji20 と表示されるだけなので、実際は体裁よく HTML に整形して出力することになります。
例2)index.php
<html> <head> <meta http-equiv="content-type" content="text/html;charset=Shift_JIS"> <title>index.php</title> </head> <body> <p>お名前:<?php echo $_GET['user']; ?></p> <p>年齢:<?php echo $_GET['age']; ?></p> </body> </html>
POST リクエスト
クエリストリングを使わないリクエスト方法です。主に HTML のフォームを使いユーザが入力した値を送信する時に用います。情報量が多い場合に適しています。
POST リクエストを送信する
ブラウザから POST リクエストを送信する時には HTML のフォームを使います。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=Shift_JIS"> <title>index.php</title> </head> <body> <form method="post" action="http://xxxxxxx/index.php"> <input type="text" name="user"> <input type="text" name="age"> <input type="submit" value="Send"> </form> </body> </html>
まず、form タグの method="post" で POSTリクエストであることを明示します。次はどこに対するリクエストなのかを action="http://xxxxxxx/index.php" で指定します。
<input type="text" name="user"> の name の値 user が GETリクエストのパラメータ名にあたります。この inputタグはテキストボックスですので、ユーザが入力したテキストが user という名前で送信されることになります。name="age" も同じことです。
ユーザが Sendボタンをクリックすれば、 action で指定した URLにリクエストが送信されます。
POST リクエストのパラメータを得る
PHP にはこの値を得るためのスーパーグローバル変数「 $_POST 」が用意されています。名前が違うことを除けば、$_GET とまったく同じ方法で値を得ることが出来ます。
$_POST も配列の形を取っていて、$_POST に続く添え字がフォーム部品の name の値に対応していますので、$_POST['user'] という書式でテキストボックス name="user" に入力された値を得ることが出来ます。
例3) index.php
<?php echo $_POST['user']; // この値は、 // <input type="text" name="user"> の入力値。 echo $_POST['age']; // この値は、 // <input type="text" name="age"> の入力値。 ?>
例3を実行しても 入力値が連続して表示されるだけなので、これまた体裁よく HTML に整形して出力することになるでしょう。$_GET の場合とまったく同じです
例4) index.php
<html> <head> <meta http-equiv="content-type" content="text/html;charset=Shift_JIS"> <title>index.php</title> </head> <body> <p>お名前:<?php echo $_POST['user']; ?></p> <p>年齢:<?php echo $_POST['age']; ?></p> </body> </html>
COOKIE
COOKIE(クッキー) は、一時的にクライアントのコンピュータに値を保存し、リクエストをまたいで再利用する仕組みで、ユーザのハンドルネームや前回のアクセス日時などを保存して、クライアント固有のサービスを提供するのに用いられます。
基本的にサーバ側で値を設定しサーバ側で利用するためのものです。保存された値はクライアントが次のリクエストを送信した際、一緒にサーバに送られます。
COOKIE はクライアントのコンピュータに保存するので、利用できるかどうかはクライアントに依存します。大抵のブラウザは COOKIE を実装していますがプライバシーを守るために使えないよう設定できますし、元から実装してないクライアントもありますので、常に利用可能ではないことを念頭においておきましょう。
COOKIE を送信する
クライアントのコンピュータに値を保存するには setcookie 関数を使ってクライアントに COOKIE を送信します。
基本的な書式はこんな具合です。第一引数は「クッキーの名前」で任意の文字列を指定します。第二引数は設定する「値」でこれも文字列です。第三引数はこの COOKIE の「有効期限」をタイムスタンプで指定します。タイムスタンプは 1970/1/1からの経過秒数のことで、time 関数などで得た現在時刻に必要秒数を加えた数値を指定します。
<?php
// 書式: setcookie ( 'COOKIEの名前', 値, 有効期限 )
// 有効期限を1週間後に設定した例
setcookie('user', 'Yuji', time() + 3600*24*7);
?>
COOKIE の値を得る
COOKIE の値を得るためのスーパーグローバル変数「 $_COOKIE 」が用意されています。名前が違うことを除けば、$_GET や $_POST とまったく同じ扱いです。
COOKIE も配列の形を取っていて、$_COOKIE に続く添え字が送信した COOKIEの名前 に対応していますので、$_COOKIE['user'] という書式で Yuji を得ることが出来ます。
<?php echo $_COOKIE['user']; ?>
COOKIE を削除する
COOKIE を削除するには、有効期限に過去のタイムスタンプを設定し COOKIEを送信します。
<?php
// 有効期限に1を設定した例
setcookie('user', 'Yuji', 1);
?>
実際にクッキーを削除するのはクライアントです。クライアントは現在時刻と有効期限を比較し古い COOKIE を順次削除するのですが、クライアントPCの時刻がずれていると狙ったタイミングでは有効期限切れと判断されない場合があります。
COOKIE を送信できるタイミング
echo や print による出力またPHPタグ外などは「レスポンスボディ」と呼ばれる言わば「本文」なのに対し、COOKIE は 「レスポンスヘッダ」と呼ばれる「本文の説明」の一部としてクライアントに送信されます。 HTTP のお約束では、レスポンスヘッダ の後に レスポンスボディ を送信しなければならないので、echo などで何か出力した後で COOKIE を送信することはできません。
どうしても後から送信しなければならない場合は、あらかじめ ob_start で出力バッファリングを行っておけば、後から COOKIE も可能です。
