Cookie
Cookieとは
Webサーバー側のプログラムが、クライアントの情報を得る手段は限られています。
その1つの手段がCookie。Cookieは「クッキー」と発音します。
クライアントの情報を使って処理したい、というときにはCookieが活躍します。
Cookieの一般的な利用方法を解説します。まずWebアプリケーションは、たとえばユーザーが検索したキーワードや、購入した商品、ハンドル名などの情報Cookieとしてクライアント側に保存させることができます。ただし、ユーザーは設定により保存を拒否することもできます。
クライアント側に保存されたCookieは、次にユーザーが同じWebサイトを利用したときに使われます。たとえば前回の検索キーワードや購入した商品などの情報をCookieから取得して、自動的に表示したり処理したりすることができます。
Cookieの仕組み
■Cookieに関する設定
Cookieはクライアント側に保存する情報です。ブラウザ側でCookieの保存を拒否することも可能です。しかし、拒否している状態ではこれからの学習に支障がでます。まずは自分のパソコン(クライアント側)の設定を確認してみましょう。
次はInternet Explorerを例としたCookieの利用設定の確認手順です。
①メニューバーから【ツール】➡【インターネットオプション】を選択
②【プライバシー】タブ➡【詳細設定】ボタンをクリックして、「自動Cookie処理を上書きする」のチェックが外れてることを確認する
Cookieを使ってみよう
ではとりあえずCookieの機能を試してみることにしましょう。Cookieをクライアント(ブラウザ)側のコンピュータに保存するときはsetcookie関数を使います。
関数setcookie
書式 setcookie("Cookieの名前",保管する値[,有効期限])
機能 Cookieをクライアント側に送信する
返り値 成功するとTRUEを、失敗するとFALSEを返す
注意 「有効期限」はUNIXタイムスタンプ
「有効期限」はUNIXタイムスタンプ(1970年1月1日からの経過秒数)で表します。例えば有効期限を1日間に設定する場合、次を指定します。
time() + 60 *60*24
time()で現在のタイムスタンプを取得し、これに24時間分の秒数(60*60*24)を足したタイムスタンプを計算しています。上記は「現在から1日後までは利用可」という設定になります。「有効期限」を省略すると、プラウザを閉じるまでが有効期限となります。また過去の期限を指定すると、そのCookieは削除されます。
次は「my_mem」という名前のCookieに、「有効期限」を1日間として、「This_is_my_data」の文字列を保管するPHPスクリプトです。「cookie_test1.php」というファイル名で保存し実行します。
<?php
setcookie("my_mem","this_is_my_data",time()+60*60*24);
?>
ブラウザには何も表示されません。これでクライアント側に「my_mem」という名前のCookieが保存されるはずです。
■保管したCookieの値を表示する
では保管したCookieの内容を表示してみましょう。
保管されたCookieの情報は、スーパーグローバル変数の$_COOKIEに保存されます。
$_COOKIEはcookieの名前をキーに持つ連想配列です。この例でしたら、「my_mem」をキーに指定することで、保管した値を取得することができます。
<?php
print $_COOKIE["my_mem"];
?>
実行結果
上記のように保管されている値「this_is_my_data」が表示されました。もちろん、保管期限は24時間ですから、24時間経過後は何も表示されません。
■Cookieをsetcooki関数で削除する
setcookie関数で「有効期限」に過去の期限を指定すると、そのCookieは削除されます。たとえば次を実行すると、「有効期限」に現在より3600秒前を指定しているため、Cookie「my_mem」が削除されます。
<?php
setcookie("my_mem","",time()-3600);
print "「my_mem」を削除しました。";
?>
Cookieを使ったサンプル
ここではCookieの利用方法を解説するために、サンプルをいくつか紹介します。
■Cookieで閲覧した回数を表示
閲覧した回数を「kaisu」という名前のCookieに保管します。
はじめての閲覧で、Cookieに値が入っていない場合「はじめてのご来場ありがとうございます」を表示します。また2度目以降の閲覧でCookieが保管されている場合は、1増やした値をセットし表示します。このサンプルでのCookie保管期限は365日です。
eturan.php
<?php
if(!isset($_COOKIE["kaisu"])){ ①
setcookie("kaisu",1,time()+60*60*24*365); ②
print "はじめてのご来場ありがとうございます";
}else{
$n = $_COOKIE["kaisu"]+1; ③
setcookie("kaisu",$n,time()+60*60*24*365); ③
print $n."回目のご来場ありがとうございます"; ③
}
?>
はじめてアクセスした場合
2回目にアクセスした場合
このプログラムでは閲覧した回数を「kaisu」という名前のCookieに保管します。したがって、もしCookie[kaisu]に値が入っていなければ、「はじめての入場者」ということになります。それを調べているのが①のif文の条件です。
if(!isset($_COOKIE["kaisu"])){
issetは、変数が定義されているかどうか、つまり変数に値がセットされているかどうかを調べる関数です。
関数 isset
書式 isset(調べる関数)
機能 「調べる変数」に値がセットされているかどうかを調べる。
返り値 変数がセットされていればTRUE,そうでなければFALSEを返す
「isset($_COOKIE["kaisu"])」は、$_COOKIE["kaisu"]に値が設定されていたらTRUEに、入ったことがなければ(はじめての入場者)ならFALSEになります。
「!」の意味は、たとえば「$a!=$b」は「$aは$bと等しくない」を意味するということを勉強しました。実は「!」という演算子は、andやorのような論理演算子で、「!」を付けると「FALSEはTRUEに」「TRUEはFALSE」に変更されます。
したがって!演算子が付いた「!isset($_COOKIE["kaisu"]))は、「kaisu」のCookieに「値が入ったことがないときに」にTRUEになります。
「if(!変数){」というのは、「もし変数がセットされてなければ...」という意味になるのですね。
Cookie[kaisu]がセットされていなかった場合は「はじめての入場者」なので、Cookie「kaisu」に「1」をセットします(②)。Cookieの保管期限は365日としています。
setcookie("kaisu",1,time()+60*60*24*365);
そしてすでに$_COOKIE["kaisu"]に値がセットされていた場合は、その値に1を加えてCookieを書き出しています(③)。
$n = $_COOKIE["kaisu"]+1;
setcookie("kaisu",$n,time()+60*60*24*365);
Cookieの保管期限は、初回のときと同様に365日としています。このようにしてアクセスカウンタのような処理を実現しています。
■ログインでユーザー名を自動入力
次に「ログインで過去に入力したユーザー名を自動入力する」PHPスクリプトを作ってみることにしましょう。
ログイン画面が表示されると、前回入力したユーザー名がすでに入力済みとなるといったものです。もちろんパスワードもCookieに保存しておけば自動入力することも可能です。しかしパスワードのような重要な情報は漏洩の恐れがあるので、決してCookieに保存させてはいけません。
・フォームの作成
この例ではフォーム側でもPHPを使用しています。入力用のテキストボックスは2つ、NAME属性が「user」のほうがユーザー名入力用です。
<html>
<head>
<title>クッキーのサンプル</title>
</head>
<body>
<FORM ACTION="cookie_logon2.php" METHOD="post">
<?php
$vd = (isset($_COOKIE["data_user"]))? $_COOKIE["data_user"]:"";
print "ユーザー名<INPUT TYPE='text' NAME='user' VALUE='$vd'><br>";
?>
パスワード<INPUT TYPE="password" NAME="pass"><br>
<input type="submit" value="送信">
</FORM>
</BODY>
</HTML>
実行結果
Cookieの名前は受信側のCookie_logon2.phpで設定する「data_user」です。すでに保存してある「data_user」のCookieはスーパーグローバル変数$_COOKIEを使って、$_COOKIE["data_user"]で取得することができます。
①では三項演算子を使って、もし$_COOKIE["data_user"]がセットされいればその値を、されていなければ" "(空白)を変数$vdに代入します。
$vd = (isset($_COOKIE["data_user"]))? $_COOKIE["data_user"]:"";
$vdの値は<input>タグのVALUE属性に設定します。これにより、もし以前にユーザー名を入力して送信したことがある場合は、あらかじめそのユーザー名が表示されることになります。
print "ユーザー名<input type='text' name='user' value='$vd'><br>";
この送信を受けるのが次のPHPスクリプトです。行っている処理は、Cookieの書込みと「ようこそ」の文字列を表示するだけです。
<?php
$u = $_POST['user'];
setcookie("data_user","$u",time()+60*60*24*365);
print "ようこそ!";
?>
cookie_logon1の変化
はじめてアクセスしたとき。「ユーザー名」のテキストボックスには何も表示されない
2回目以降はユーザー名があらかじめ表示される
POST送信されてきた値を変数$uに代入し、この値を、"data_user"の名前のCookieに書き込みます。「保管期限」は「time()+60*60*24*365)」としました。これで「現在から365日後までは利用可」という設定をしたことになります。
すでにCookieが存在していても、存在していなくても、とにかくCookieを上書きして、最後に入力したユーザー名が自動入力できるようにします。