PHPでのCookieの利用

3年以上前に更新されました。情報が古い可能性があります。
更新日 : 2019年07月12日

HTTPで使用することができるCookieを、PHPからアクセスして扱っていきます。

Cookieは小さなデータしか保存できないため、近年ではセッションのために利用されることが多いですが、基本的な使い方も学んでいきましょう。

Cookieの保存

まずはクライアントにCookieを保存させなければ始まりません。Cookieをクライアントのブラウザに保存させるための処理を、setcookie関数を利用して行ってみましょう。

setcookie関数の書式

まずはsetcookie関数の書式を見てみましょう。

<?php
setcookie(クッキー名[string], 値[string], 期限[int], パス[string], ドメイン[string], セキュア[bool], HTTPオンリー[bool]) : bool

引数が多いですが、後半のパス・ドメイン・セキュア・HTTPオンリーは指定しなくても構いません。必ず必要なのはクッキー名と値です。値も省略可能ですが、普通は保存したいCookieがあるからこそ実行するはずなので省略はしないでしょう。

また、期限はCookieを保存しておく期間をいつまでにするかを設定します。
intを指定することになっていますが、ここはUNIXタイムスタンプという値を設定します。省略することも可能で、省略した場合または0を指定した場合にはブラウザを閉じるまでCookieが保存されます。

UNIXタイムスタンプとは、1970年1月1日午前0時をスタートとして、経過した秒数のことです。UNIXタイムスタンプに関しては改めて記事にします。

このsetcookie関数を実行すると、Cookieをクライアントに保存する指示を作成します。setcookie処理に問題がなければ返り値としてtrue・失敗すればfalseが渡されます

つまり、$result = setcookie("name", "message")などとした際に、問題なくCookie保存処理がうまくいくと、$resultにはtrueが格納されます。もちろん失敗した場合はfalseが格納されます。

同一名のCookieがクライアントに存在した場合は上書きされます。

setcookie関数の注意点

setcookie関数を使用する際、setcookie関数より前にPHP以外の空白行やHTMLコードがあるとエラーになります。

Cookieの保存指示は、レスポンスのHTTPヘッダーに記載されてクライアントに実際に保存されるため、setcookie関数実行時にHTTPボディがまだ何もない状態でなければ保存ができないからです。

setcookie関数を使ったCookieの保存

実際にsetcookie関数を利用してCookieをクライアントに保存させてみましょう。

<?php
// クッキーに保存する値
$message = "test-message";
// クッキーを保存する指示を作成(ブラウザを閉じるまで有効)
$result = setcookie("message", $message);
?>

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>クッキー保存</title>
</head>
<body>
	<div>
	<?php
		// $resultにはtrueかfalseが入っている
		if ($result){
			echo "クッキーを保存しました!" . "<hr>";
			echo '<a href="check_cookie.php">クッキーを確認するページへ</a>';
		} else {
			echo '<span class="error">クッキーの保存でエラーがありました。</span>' . "<br>";
		}
	?>
	</div>
</body>
</html>

順番に解説します。

$result = setcookie("message", $message)でCookieをセットする指示を作成しています。Cookieのキー名がmessageで値はtest-messageとなっています。

setcookie関数よりも上にはHTMLやPHP以外のコードはありません。

次に、if($result)の部分ですが、$resultには、Cookieの保存処理がきちんとできているか(保存できていればtrue、失敗していればfalse)がわかるデータが入っています。なのでこれをそのままif文で$resultをチェックすれば、保存できていた場合とできていない場合で処理分岐が可能です。

実際にこのPHPファイルにアクセスしてみましょう。

アクセス後、chromeでは右クリックで検証ボタンを押すとクライアントに保存されたCookieを確認できます。画像のように確認してみましょう。

Application→Cookie→localhostで確認ができます。

キー名・値ともにきちんとCookieが保存できているのが確認できますね。

Cookieから値を取り出す

クライアントにCookieが保存できたら、保存されたCookieを取り出して表示してみましょう。

$_COOKIEの使い方

保存されているCookieを取り出す際には$_COOKIEを利用します。PHPでのGETデータの受け取りPHPでのPOSTデータの受け取りで学んだ$_GET$_POSTと使い方は変わりません。$_COOKIE変数に配列で格納されているため、これで保存されたCookieを取得できます。

$_COOKIEを利用したCookieの取り出し

setcookie関数の実行テストをした上のPHPファイルにはcheck_cookie.phpファイルへのリンクがあるため、このファイルを作成して、Cookieの取り出し処理を行ってみましょう。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>クッキー確認</title>
</head>
<body>
	<div>
		クッキーを確認します<br>
	<?php
	if(isset($_COOKIE["message"])){
	// クッキーの値を取り出す
		$message = $_COOKIE["message"];
		echo "クッキーの値:" . htmlspecialchars($message, ENT_QUOTES, 'UTF-8') . "<hr>";
	} else {
		echo "クッキーはありません。" . "<hr>";
		echo '<a href="set_cookie.php">クッキーを設定するページへ</a>';
	}
	?>
	</div>
</body>
</html>

解説していきます。

まずは毎度使っているisset関数で、取り出したいCookieが存在するかどうか調べています。存在しなければ「クッキーはありません」という表示になります。

Cookieが存在した場合には$message変数にそのCookieの値を代入し、それを表示しています。ブラウザには先程保存したtest-messageが表示されるはずです!

Cookie取り出し時の注意点

Cookieはあくまでクライアントに保存される値です。そのためクライアント側がこのCookieの値を変更することも可能です。先程のChromeの検証画面でもダブルクリックすると編集できてしまいます。

そのため、Cookieの値をそのまま表示などに利用する際には、htmlspecialchars関数を利用してHTMLエスケープを行い、HTMLエンティティへ変換してから表示するようにしましょう。

Cookieの削除について

最後にCookieの削除について説明します。

PHPにはCookieの削除関数はありません。任意のタイミングで削除したいCookieがある場合にはどのようにすれば良いでしょうか。

答えは「setcookie関数を利用する」です。

setcookie関数を利用して期限を過去日にすると、クライアントブラウザ上で削除されます。期限を0とすると、ブラウザを閉じるまで有効になってしまうので、削除する際には期限の引数に1を入れると良いでしょう。

まとめ

Cookieの保存と利用について学びました。利用に関してはGETメソッドやPOSTメソッドのデータ取り出しとそんなに変わらないため、それらが理解できていれば比較的簡単かと思います。

Cookieの保存や削除に関しては以下の点を理解しておきましょう。

  • setcookie関数を利用してCookieの保存を行う
  • 関数利用時、期限を省略すればブラウザを閉じるまで有効
  • setcookie関数はHTTPボディが作成されていないタイミング(HTMLやPHP以外の空白がない状態で)実行する
  • Cookieの削除は期限に1を入れればOK
  • Cookieの値出力時はHTMLエスケープを忘れずに

タグ