PHPでのCookieの利用
更新日 : 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エスケープを忘れずに
タグ
-
前の記事
PHPでのHTMLエスケープ
-
次の記事
PHPでのセッションの利用