[ PHP ] cookie 配列での送受信と削除 ( setcookie / setrawcookie )

Pocket

ブラウザと Web サーバの情報共有に利用される cookie ですが、ここでは配列で cookie の送受信を行うサンプルコードを掲載しています。

スポンサーリンク

cookie を配列で送受信する

cookie はキー・バリュー形式で保存されていますが、1 つのキーに対して複数の値を持たせたいケースでは cookie 名を配列のように指定することができます。下記のサンプルを参照ください。

// 送信するcookieの値
$value1 = 'strong1';
$value2 = 'strong2';
$value3 = 'strong3';

/*
 * cookie を配列で送信する
 */
setcookie("ArrayCookies[one]",   $value1);
setcookie("ArrayCookies[two]",   $value2);
setcookie("ArrayCookies[three]", $value3);

/*
 * 受信した Cookie を取得する
 */
if (isset($_COOKIE['ArrayCookies'])) {
    foreach ($_COOKIE['ArrayCookies'] as $name => $value) {
        $name  = htmlspecialchars($name);
        $value = htmlspecialchars($value);
        echo "$name : $value \n";
    }
}

結果(見易さのため、一部表示結果は加工している)
---------------------------------------------------
one   : strong1 
two   : strong2 
three : strong3 

配列のイメージ('[‘ と ‘]’ で囲む)でキーを設定して、それぞれ値を設定しています。実際には PHP は個別のクッキーを送信していますが、cokkie 受信時にキー名を元に配列を構築し、プログラムでは配列アクセスできるようにしています。以下のような setcookie 関数をラップした setcookies 関数を作成しても良いかもしれません。

/*
 * cookie を配列で設定する
 */
function setcookies($name, array $values, $lifetime)
{
    foreach ($values as $key => $value) {
        setcookie($name . '[' . $key . ']', $value, time() + $lifetime);
    }
}

/*
 * 使用方法
 */
$lifetime = 600;             // 削除したい場合はマイナス値を設定する
$cookiename = 'arraycookie'; // cookie 名
$values = array('key1' => 'value1', 'key2' => 'value2'); // 値

setcookies($cookiename, $values, $lifetime);

cookie を削除する

上記サンプルでは配列のように cookie を送受信しましたが、cookie を削除するときはあくまでも 1つずつ削除する必要があります。上記のようにラップ関数を作成しても良いでしょう。なお、cookie を削除するには有効時間を過去時間にしてブラウザに通知します。

// cookie を削除する
setcookie("ArrayCookies[one]",   null, time() - 600);
setcookie("ArrayCookies[two]",   null, time() - 600);
setcookie("ArrayCookies[three]", null, time() - 600);

setcookie 関数と setrawcookie 関数の違い

cookie を送受信する関数には setcookie 関数の他に setrawcookie 関数があります。両者の違いは下表の通りです。

setcookie 関数 URLエンコードした値を送る
setrawcookie 関数 そのまま送る
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *