PHPの基礎 - クッキー

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

PHPにおいて、クッキーを利用する方法を記載する。


クッキーの送信

クッキーは、クライアントにデータを保存するためのものである。

例えば、Webサイトを閲覧したクライアントに対してクッキーを送信して保存することにより、
次に、同じWebサイトにアクセスする時、クッキーの有無を確認することで初めての訪問者なのかどうかを確認することができる。

以下の例では、Webサイトにアクセスする時、クライアントに対してクッキーを送信して保存している。
これは、setcookie関数を使用する。

bool setcookie(string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

setcookie関数は、その他のヘッダ情報と共に送信するクッキーを定義する。
他のヘッダ情報と同様に、クッキーは、スクリプトによる他のあらゆる出力よりも前に送信される必要がある。
もし、setcookie関数を呼ぶ前に何らかの出力がある場合は、setcookie関数は失敗してfalseを返す。
setcookie関数が正常に実行される場合、trueを返す。
この関数はユーザーがクッキーを受け入れたかどうかを示すことはしない。

パラメータ:
   name  クッキーの名前
   value  クッキーの値
   expire  クッキーの有効期限
   path  サーバー上での、クッキーを有効としたいパス
   domain  クッキーが有効なドメイン
   secure  1をセットすると セキュアなHTTPS接続の場合にのみクッキーが送信されるようになる。標準は0である。

戻り値:
   正常に実行されるとtrue


基本となるのは、クッキーの名前と値である。
例えば、visitedという名前のクッキーを作成して、値に訪問回数である1を書き込む場合は、以下のように記述する。

 <?php
    $flag = setcookie("visited", 1);
 ?>
 
 <?php
    if($flag)
    {
       print('<p>クッキーを書き込みました</p>');
    }
    else
    {
       print('<p>クッキーの書き込みに失敗しました</p>');
    }
 ?>



クッキーの読み込み

クライアントに保存したクッキーを読み取る手順を記載する。

サーバによりクッキーが保存される時、次に、同一のサーバに対してアクセスすると、保存したクッキーを環境変数としてサーバへ送信する。
サーバでは、クライアントからWebページの要求等がある時、クッキーが合わせて送信されているかを確認する。

クライアントからクッキーが送信されているかを確認するには、定義済みの連想配列$_COOKIEの内容を見ることで確認できる。
$_COOKIEは、サーバに送信された全てのクッキーが格納された配列である。

特定のクッキーの値を確認するには、以下のように記述する。

 $val = $_COOKIE["クッキーの名前"]


例えば、前のセクションで使用したvisitedという名前のクッキーの値を取り出す場合は、以下のように記述する。

 $val = $_COOKIE["visited"]


以下の例では、クッキーの値を確認して、クッキーが送信されていなければ初期値をクッキーに保存している。
また、クッキーが保存されている場合は、値を取り出して1追加する。

 <?php
    if(isset($_COOKIE["visited"]))
    {
       $count = $_COOKIE["visited"] + 1;
    }
    else
    {
       $count = 1;
    }
 
    $flag = setcookie("visited", $count);
 ?>
 
 <?php
    print('<p>訪問回数は'.$count.'回目です</p>');
 ?>



クッキーの有効期限の設定

クッキーの有効期限を指定しない場合、クライアントのWebブラウザが終了すると削除される。
Webブラウザが終了してもクッキーを一定期間残す場合は、明示的にクッキーの有効期限を設定する。

クッキーの有効期限は、setcookie関数の3番目の引数で指定する。

指定する値は、UNIX標準時1970年1月1日からの秒数で指定することになっているため、
まず、現在時刻のUNIX標準時からの経過秒数を取得して、クッキーの有効期限を秒に換算した値を加算して設定する。
現在時刻のUNIX標準時からの経過秒数は、time関数で取得できる。
(time関数の詳細については、PHPの基礎 - 日時を参照すること)

以下の例では、クッキーの有効期限を現在から3日間にしている。

 time() + 259200  // 259200 = 60(秒) * 60(分) * 24(時間) * 3(日)


以下の例では、有効期限を3分間にしている。

 <?php
    if(isset($_COOKIE["visited"]))
    {
       $count = $_COOKIE["visited"] + 1;
    }
    else
    {
       $count = 1;
    }
 
    $flag = setcookie("visited", $count, time() + 180);
 ?>
 
 <?php
    print('<p>訪問回数は'.$count.'回目です</p>');
 ?>



クッキーの削除

クッキーを削除するには、有効期限を昔の時間に設定することで削除できる。
不要なクッキーはできる限り削除することが望ましい。

以下の例では、有効期限30分のクッキーに対して、30分前の時間に戻している。

 setcookie("<クッキー名>", "", time() - 1800);
 
 // より安全な方法
 setcookie("<クッキー名>",        // 削除するクッキーの名前
     "", [                      // クッキーの値を空にする
    'expires' => time() - 3600, // 有効期限を30分前前 (1800秒前) に設定して無効化
    'path' => '/',              // クッキーが有効なパス ('/'はサイト全体)
    'domain' => 'example.com',  // クッキーが有効なドメイン
    'secure' => true,           // HTTPS接続でのみ送信 (true)
    'httponly' => true,         // JavaScriptからアクセス不可 (true)
    'samesite' => 'Strict'      // クロスサイトリクエストを制限 (Strictは同一サイトのみ)
 ]);


以下の例では、Webサイトに3回アクセスがある場合、クッキーを削除している。

 <?php
    if(isset($_COOKIE["visited"])) $count = $_COOKIE["visited"] + 1;
    else                           $count = 1;
 
    if($count > 3) {
       setcookie("visited", $count, time() - 1800);
       $count = 1;
    }
    else {
       setcookie("visited", $count);
    }
 ?>
 
 <?php
    print('<p>訪問回数は'.$count.'回目です</p>');
 ?>



1つのクッキーに複数の値を保存する

1つのサーバからクライアントに送信できるクッキーは1つだけではない。

例えば、以下のように、複数のクッキーを送信することができる。

 setcookie("user", "yamada");
 setcookie("pass", "pass");


ただし、クライアントは1つのサーバから受信できるクッキーは最大20個、全体でも合計300個までのクッキーしか保存できない。
そのため、多くのクッキーを利用する場合は、工夫が必要となる。

20個以上のクッキーを送信する場合は、クッキー名を配列のように扱うことにより、配列の各要素に値を代入する。
配列にすることにより、クッキー名としてはbuyのみ使用されるため、1つのクッキーのみ消費する。

 setcookie("buy[1]", "Televison");
 setcookie("buy[2]", "Video");
 setcookie("buy[3]", "Audio");


配列からクッキーを取得するには、以下のように記述する。

 $val = $_COOKIE['cookie'];
 
 print($val[1]);
 print($val[2]);
 print($val[3]);
 
 <?php
    if (isset($_COOKIE["buy"]))
    {
       $val = $_COOKIE["buy"];
       print('<p>');
       print('購入したものは下記の通りです<br>');
       print($val[1].'<br>');
       print($val[2].'<br>');
       print($val[3]);
       print('</p>');
    }
    else
    {
       print('<p>値をセットしました</p>');
    }
 ?>