13. クッキーとセッション
今日はクッキーとセッションについてご説明いたします。
■クッキーについて
クッキーとは、アクセスしてきたユーザのローカルマシンにテキストデータ
を保存できる機能のことを言います。
例えば、アクセスカウンターなどで同じ人がアクセスしてきた場合は、カウント
しないようにしたり、会員サイトなどで、ログイン情報をユーザに持たせて、
会員のみ表示できるページを表示させるなどといった使い方があります。
■クッキーの受け渡し方法
PHPでのクッキーの受け渡しは非常に簡単です。
-----------------------------------------------------------------
// クッキー設定
setcookie("cookie_name", "cookie_value", time()+3600);
// クッキー取り出し
print $_COOKIE["cookie_name"];
-----------------------------------------------------------------
クッキーはHTMLの前にクライアントに送られるHTTPヘッダに記述されますので、
クッキーを設定するときは、HTMLを出力する前に行ってください。
setcookie関数を使用してクッキーにデータを設定します。引数は、順に
クッキー名、保存する値、有効期間となります。
有効期間は、1970年1月1日からの秒数(UNIXタイムスタンプ)になります。
この有効期間が過ぎると、クッキーは削除され、クッキーを取り出すことが
できなくなります。
クッキーの有効期間を1時間とする場合は、time()+3600とします。
取り出す時は、$_COOKIEというハッシュ配列を使用することで、取り出せます。
設定した時のクッキー名がハッシュ配列のキーとなります。
クッキーはクライアントのマシンに書き込まれるため、設定したクッキーを、
レスポンスを返す前に取得することはできません。
一度でもレスポンスをクライアントに返していれば、その時に設定したクッキー
を取り出せます。クッキーは、HTTPヘッダに記述するので、レスポンスを一度も
返していないと、クッキーには何も書かれていないためです。
つまり、上記のサンプルを一つのプログラムで行った場合、print文では何も
表示されません。
しかし、2回目のアクセス時には、前回のアクセスで設定したクッキーが取り出せる
ということになります。
■クッキーの制限について
クッキーは、テキストデータのみ保存可能となっております。
また、クッキーは、全体で 4Kバイトまでしか書き込めません。
クッキーに保存できるキーは、20個までとなっております。
ユーザのマシンなのに何でもかんでも書き込めてしまうと、ハードディスクを
いっぱいにしたりできてしまいますので、制限は当然必要ですね。
■セッションについて
セッションとは、クッキーを利用したユーザ毎のデータを保存する機能で、
クッキーより便利です。
原理としては、アクセスしたユーザ毎にセッションIDを発行し、そのIDを
クッキーに保持しますが、実際の中身のデータはサーバに保存され、セッション
ID毎にデータと紐付けされます。
プログラマーはこの辺りを意識することなく、簡単にセッションを管理する
ことができます。
■セッションの受け渡し方法
セッションの受け渡しは、以下のようにします。
-----------------------------------------------------------------
// セッション使用宣言
session_start();
// セッション設定
$_SESSION["session_name"] = "session_value";
// セッション取り出し
print $_SESSION["session_name"];
-----------------------------------------------------------------
セッションを使用する時は、設定する時も、取り出す時も、必ず最初に
session_start()関数を呼び出して、セッションの使用宣言をします。
あとは、$_SESSIONのハッシュ配列を使用して受け渡しができます。
クッキーと違い、サーバにデータが保存されますので、データ格納後、
レスポンスを返す前に取り出すこともできます。
■セッションの制限
クッキーと違って、データをサーバ側に保存しますので、データ容量の制限は
クッキーより大きいですが、容量制限はあります。(サーバの設定によって異なり
ます)
セッションも当然、文字列の保存のみとなります。
また、セッションが有効となる時間は、デフォルトで 3時間までとなっています。
セッションの有効時間は、session_cache_expire関数を使用すれば、変更することが
できますが、保存している全てのセッションの有効時間が変わってしまいますので、
注意してください。
セッションには、他にもいくつかの関数が用意されていますので、興味があれば
マニュアルを調べてみてください。基本的には、上記の受け渡し方法さえ分かれば
十分です。
★今日のまとめサンプルプログラム
サンプル 1
-----------------------------------------------------------------
<?
// クッキー名
$cookie_name = "cname";
// クッキーを取得
$count = $_COOKIE[$cookie_name];
if (!$count)
{
$count = 1;
}
else
{
$count++;
}
// クッキーに書き込み
setcookie($cookie_name, $count, time()+3600);
?>
<HTML>
<BODY>
<?=$count?>回目の訪問ありがとうございます。
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
ユーザがこのページを訪れた回数を表示するサンプルです。
最初にアクセスした時はクッキーに何も保存されていないので、デフォルトの値を
表示しますが、2回目からは、クッキーからデータを取得します。
クッキーを利用してユーザのローカルマシンに保存するので、アクセスカウンタと
違い、ユーザ毎に違うカウントが表示されます。
サンプルでは、クッキーの有効期限を 1時間(3600秒)に設定しています。
クッキーを削除したい場合は、有効期限を 0以下にして保存させればOKです。
サンプル 2
-----------------------------------------------------------------
<?
// セッション使用宣言
session_start();
// セッション名
$session_name = "sname";
// セッションを取得
$count = $_SESSION[$session_name];
if (!$count)
{
$count = 1;
}
else
{
$count++;
}
// セッションに書き込み
$_SESSION[$session_name] = $count;
?>
<HTML>
<BODY>
<?=$count?>回目の訪問ありがとうございます。
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
先ほどのアクセス回数を表示するサンプルのセッション版です。
最初に必ずsession_start()を呼びます。
後は$_SESSIONのハッシュ配列を使用するだけですので、非常にシンプルに
なります。
ただし、有効期限は、デフォルトで 3時間になりますので、3時間後にアクセス
すると、カウントが1に戻ります。
★課題
1. クッキーに接続した日時(YYYY/MM/DD HH:MM:SS)を保存し、取り出すプログラムを
作成してください。取り出した日時は、「前回のアクセス日時」として、HTML上に
表示してください。1つのプログラムにまとめてしまっても結構です。
2. HTML上に、名前の入力ボックスを作成し、これをPOSTで受け取り、セッションに
保存し、次回のアクセス時からは、この名前が表示されるプログラムを作成して
ください。1つのプログラムにまとめてしまっても結構です。
★前回の課題の解答
1. 以下のテキスト情報をPOSTで受け取って、HTML上に受け取ったデータを表示する
プログラムを作成してください。また、()の条件に合わない場合は、エラー
メッセージを表示するようにしてください。
・名前 (50バイトまで)
・郵便番号 (8バイトまで、半角数字・ハイフンのみ)
・住所 (255バイトまで)
・電話番号 (13バイトまで、半角数字・ハイフンのみ)
・メールアドレス (50バイトまで、"@"と"."が含まれている)
・コメント (255バイトまで)
→下のサンプルを参照してください。
2. 1の問題で受け取った情報をファイルに追加書き込みしていくプログラムを作成
してください。(カンマ区切り)
→下のサンプルを参照してください。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
// 1. パラメータの受け取り
$err_msg = "";
// エラーチェック
// 名前のチェック
if (strlen($_POST['name']) > 50) {
$err_msg .= "名前は、50バイト以内で入力してください。<br>\n";
}
// 郵便番号のチェック
if (strlen($_POST['post_code']) > 8) {
$err_msg .= "郵便番号は、8バイト以内で入力してください。<br>\n";
}
elseif (ereg("[^0-9]+", $_POST['post_code'])) {
$err_msg .= "郵便番号は、半角数字かハイフンで入力してください。<br>\n";
}
// 住所のチェック
if (strlen($_POST['address']) > 255) {
$err_msg .= "住所は、255バイト以内で入力してください。<br>\n";
}
// 電話番号のチェック
if (strlen($_POST['tel']) > 13) {
$err_msg .= "電話番号は、13バイト以内で入力してください。<br>\n";
}
elseif (ereg("[^0-9]+", $_POST['tel'])) {
$err_msg .= "電話番号は、半角数字かハイフンで入力してください。<br>\n";
}
// メールアドレスのチェック
if (strlen($_POST['email']) > 50) {
$err_msg .= "メールアドレスは、50バイト以内で入力してください。<br>\n";
}
elseif (!ereg(".+@.+\..+", $_POST['email'])) {
$err_msg .= "メールアドレスの形式が正しくありません。<br>\n";
}
// コメントのチェック
if (strlen($_POST['comment']) > 255) {
$err_msg .= "コメントは、255バイト以内で入力してください。<br>\n";
}
if ($err_msg) {
// エラーメッセージの表示
print $err_msg;
}
else {
// パラメータの表示
print "名前 : " . $_POST['name'] . "<br>";
print "郵便番号 : " . $_POST['post_code'] . "<br>";
print "住所 : " . $_POST['address'] . "<br>";
print "電話番号 : " . $_POST['tel'] . "<br>";
print "メールアドレス : " . $_POST['email'] . "<br>";
print "コメント : " . $_POST['comment'] . "<br>";
// 2. ファイル書き込み
$filename = "data.txt";
$fh = fopen($filename, 'a');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}
// ファイルロック
flock($fh, LOCK_EX);
// データの書き込み
fwrite($fh, $_POST['name'] . ",");
fwrite($fh, $_POST['post_code'] . ",");
fwrite($fh, $_POST['address'] . ",");
fwrite($fh, $_POST['tel'] . ",");
fwrite($fh, $_POST['email'] . ",");
fwrite($fh, $_POST['comment'] . "\n");
// ファイルロック解除
flock($fh, LOCK_UN);
// ファイルクローズ
fclose($fh);
}
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
長さをチェックするときは、strlen()関数を使用します。
上の解答例では、エラーが発生した場合は、エラーメッセージを変数に入れ、
その変数が空でない場合は、メッセージを表示して終了します。
エラーがない場合は、 2問目のファイル書き込みを行います。
ファイル書き込み時は、ファイルロックを行っています。
|