クッキーで配列は使用するな

12月 13th, 2007 by admin

PHPではクッキーに配列データを保存することができる.
例えば,

setcookie(”data[0]”, “国語”, expire);
setcookie(”data[1]”, “数学”, expire);
setcookie(”data[2]”, “英語”, expire);

とクッキーに保存した配列データは

$data = $_COOKIE[”data”];
print $data[0];
print $data[1];
print $data[2];

だけで利用することができる.
便利だ.すごく便利だ.これを見るだけでは...

では問題1

クッキーから配列データを削除するにはどうすればいいのか?
クッキーからデータを削除するには通常以下のように記述する.

setcookie(”data”, “”, time()-3600);

では配列データの場合はどうなのか?
配列名だけを指定した上記と同じ記述で構わないのか?・・・否.
配列データの削除には,以下のように記述する必要がある.

setcookie(”data[0]”, “”, time()-3600);
setcookie(”data[1]”, “”, time()-3600);
setcookie(”data[2]”, “”, time()-3600);

これの何が不便なのかというと,配列の要素数が不確定の場合に大変困る.
dataという配列がクッキーにいくつ登録されているのかがわからないと,
すべてを削除することができない.
仮に2つだけ登録されてると勘違いし,以下の記述で削除を実行する.

setcookie(”data[0]”, “”, time()-3600);
setcookie(”data[1]”, “”, time()-3600);

これではdata[2]のデータがクッキーから削除されずに残ってしまう.
クッキーに不要なデータが残っても構わないという場合はそれでも良い.
しかし,次のような場合は非常に困る.

では問題2

次のような記述をした場合,実際にはどのデータがクッキーに保存されるか?

setcookie(”data[0]”, “国語”, expire);
setcookie(”data[1]”, “数学”, expire);
setcookie(”data[2]”, “英語”, expire);
setcookie(”data”, “教科”, expire);

配列データdata[0]~data[2]が優先されるのだろうか?
普通の変数であるdataが優先されるのだろうか?
答えは両方保存される.
クッキー内に,dataという普通の変数データと,data[0]~data[2]という配列データの両方が.
では,以下の記述でクッキーに保存したデータを利用した場合,どのデータが得られるのか?

$data = $_COOKIE[”data”];

どうやらPHP5.2では配列データが優先されるらしい.
つまり,$dataにはクッキーに保存されたdata[0]~data[2]のみが格納され,
data(”教科”)のデータを取得することができなくなる.

問題1と2を合わせて考える

クッキーに配列データを保存するシステムを構築した.
システム変更が生じ,クッキーへの保存形式を配列から普通の変数に変更した.
この変更の際に,クッキー内の配列データをすべて削除することに失敗した.
つまり,クッキーに配列データを残したまま普通の変数データを保存した.
新システムで,クッキーの値を使用したプログラムが何故か上手く動かない.
それもそのはず,$_COOKIE[]で取得できるデータは残骸の配列データなのだから...

回避方法として新システムでのクッキー保存変数名を変更することが考えられるが,
このような事態に陥らないよう初めから配列形式を使用しないことを勧める.

Posted in PHP


(comments are closed).