Cookie

トップ > PHP入門 > Cookie

目次

広告

Cookieとは、訪問者のコンピュータに一時的にデータを書き込んで保存する仕組みです。掲示板で名前やメールアドレスを入力すると、次回から自動的に入力済みになっていることがありますが、このような処理はCookieを使用すれば可能です。

以下で、「はじめての訪問と2回目以降の訪問で、表示内容が変化する」仕組みを例に、PHPでCookieを扱う具体的な流れを紹介します。

はじめてのアクセス

はじめてページにアクセスしたときはCookieにデータがない(訪問者のコンピュータにデータが書き込まれていない)ので、PHPプログラムではじめての人向けのページを表示します。
表示データをブラウザに送る際、表示データとともにCookieを送るとブラウザがデータを保持します。

はじめてのアクセス

2回目のアクセス

次回、同じページにアクセスしたときはCookieにデータがあります。これによりはじめての訪問でないことが分かりますので、PHPプログラムで2回目の人向けのページを表示することができます。(その際、必要ならさらにCookieを送ることもできます。)

2回目のアクセス

サーバーから送られてきたCookieを保持したり、サーバー側にCookieを自動的に送ったり…という機能は、あくまでもブラウザによる機能です。ですので、ブラウザがCookieの保持と送信に対応していなければ、何度アクセスしても「はじめての訪問」とみなされます。

また、訪問者によってはブラウザのCookie機能をOFFにしていることがあるので、「Cookieは必ず保存されるわけではない」ということに注意してください。

Cookieの利用

PHPからCookieに書き込むには setcookie 関数を使用します。また、書き込んだCookieを読み出すには $_COOKIE を参照します。$_COOKIE$_POST$_GET と同様、PHPが自動的に値をセットしてくれる連想配列です。

以下はCookieを使用したプログラムの例です。

<?php

if (isset($_COOKIE["count"])) {
  $count = $_COOKIE["count"] + 1;
} else {
  $count = 1;
}
setcookie("count", $count);

echo "${count}回目のアクセスです。";

?>

ページにアクセスすると 1回目のアクセスです。 と表示されます。ページを再読み込みすると 2回目のアクセスです。 と表示され、更に再読み込みすると 3回目のアクセスです。 と表示されます。

isset は変数が定義されているかどうか調べる関数です。初めてこのページにアクセスしたときは $_COOKIE["count"] の内容は未定義なので、if の条件は成立しません。ですが2回目以降のアクセスでは $_COOKIE["count"] は定義済みになって数値が格納されているので、条件が成立します。

なお、setcookie 関数は画面にデータを表示する前に実行する必要があります。表示後に実行しても、値はセットされません。(PHPの仕様ではなく、Cookieの仕様。)ですので、HTMLタグ込みで出力する場合は

<?php

if (isset($_COOKIE["count"])) {
  $count = $_COOKIE["count"] + 1;
} else {
  $count = 1;
}
setcookie("count", $count);

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<?php

echo "${count}回目のアクセスです。";

?>
</body>
</html>

このようにする必要があります。setcookie 関数はHTMLタグを出力する前に実行していますが、アクセス数の表示はHTMLの文法どおり body タグ内で行っています。

Cookieの有効期限

Cookieは、ブラウザを閉じると自動的に削除されます。ですが setcookie 関数でCookieを書き込む際、有効期限を指定することができます。

<?php

if (isset($_COOKIE["count"])) {
  $count = $_COOKIE["count"] + 1;
} else {
  $count = 1;
}
setcookie("count", $count, time() + 180);

echo "${count}回目のアクセスです。";

?>

time は現在のUNIXタイムスタンプ(1970年1月1日からの経過秒数)を返す関数です。今回はこのタイムスタンプに 180 を加えた値を setcookie に渡しています。このようにすると、ブラウザを閉じても180秒間はCookieの内容が保持されます。

Cookieの注意点

Cookieは上手く利用すればサイトの利便性を向上させることができますが、重要なデータをCookieで扱うと個人情報や機密情報の漏洩に繋がる可能性があります。CookieへはJavaScriptから直接アクセスすることができるため、「悪意のあるコードによって、Cookieの内容が他者に書き換えられる&読み取られる」という可能性と常に隣合わせにあります。
Cookieは訪問者のコンピュータに保存されるため、訪問者が自分でCookieの内容を書き換えることもできます。

また、Cookieに記録できるデータのサイズはそれほど大きくないため、何でもかんでもCookieに保存する設計にしてしまうと破綻してしまう可能性があります。

ですので、

を一時的に保存する場合、Cookieを使用するのは危険です。このような場合、次に紹介するセッションを使用します。