Cookie

Cookieとは

 Webサーバー側のプログラムが、クライアントの情報を得る手段は限られています。

その1つの手段がCookieCookieは「クッキー」と発音します。

クライアントの情報を使って処理したい、というときにはCookieが活躍します。

Cookieの一般的な利用方法を解説します。まずWebアプリケーションは、たとえばユーザーが検索したキーワードや、購入した商品、ハンドル名などの情報Cookieとしてクライアント側に保存させることができます。ただし、ユーザーは設定により保存を拒否することもできます。

クライアント側に保存されたCookieは、次にユーザーが同じWebサイトを利用したときに使われます。たとえば前回の検索キーワードや購入した商品などの情報をCookieから取得して、自動的に表示したり処理したりすることができます。

Cookieの仕組み

f:id:mkyosuke:20191205133854p:plain

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」というファイル名で保存し実行します。

cookie_test1.php

<?php
setcookie("my_mem","this_is_my_data",time()+60*60*24);
?>

 ブラウザには何も表示されません。これでクライアント側に「my_mem」という名前のCookieが保存されるはずです。

■保管したCookieの値を表示する

では保管したCookieの内容を表示してみましょう。

保管されたCookieの情報は、スーパーグローバル変数の$_COOKIEに保存されます。

$_COOKIEcookieの名前をキーに持つ連想配列です。この例でしたら、「my_mem」をキーに指定することで、保管した値を取得することができます。

次のPHPスクリプトを作成し、実行してください。

cookie_test2.php

<?php
print $_COOKIE["my_mem"];
?>

実行結果

f:id:mkyosuke:20191205145845p:plain

上記のように保管されている値「this_is_my_data」が表示されました。もちろん、保管期限は24時間ですから、24時間経過後は何も表示されません。

Cookieをsetcooki関数で削除する

setcookie関数で「有効期限」に過去の期限を指定すると、そのCookieは削除されます。たとえば次を実行すると、「有効期限」に現在より3600秒前を指定しているため、Cookie「my_mem」が削除されます。

cookie_del.php

<?php
setcookie("my_mem","",time()-3600);
print "「my_mem」を削除しました。";
?>

Cookieを使ったサンプル

ここではCookieの利用方法を解説するために、サンプルをいくつか紹介します。

Cookieで閲覧した回数を表示

次は閲覧した回数を表示するPHPスクリプトです。

閲覧した回数を「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."回目のご来場ありがとうございます";      ③
}
?>

はじめてアクセスした場合

f:id:mkyosuke:20191205154144p:plain

2回目にアクセスした場合

f:id:mkyosuke:20191205154616p:plain

このプログラムでは閲覧した回数を「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」のほうがユーザー名入力用です。

cookie_logon1.php

<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>

実行結果

f:id:mkyosuke:20191205163259p:plain

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スクリプト

 この送信を受けるのが次のPHPスクリプトです。行っている処理は、Cookieの書込みと「ようこそ」の文字列を表示するだけです。

cookie_logon2.php

<?php
$u = $_POST['user'];
setcookie("data_user","$u",time()+60*60*24*365);
print "ようこそ!";
?>

 

cookie_logon1の変化

はじめてアクセスしたとき。「ユーザー名」のテキストボックスには何も表示されない

f:id:mkyosuke:20191205163259p:plain

2回目以降はユーザー名があらかじめ表示される

f:id:mkyosuke:20191205170123p:plain

POST送信されてきた値を変数$uに代入し、この値を、"data_user"の名前のCookieに書き込みます。「保管期限」は「time()+60*60*24*365)」としました。これで「現在から365日後までは利用可」という設定をしたことになります。

すでにCookieが存在していても、存在していなくても、とにかくCookieを上書きして、最後に入力したユーザー名が自動入力できるようにします。