配列を利用したクッキー
クッキーに配列利用
1台のサーバが同一PCに発行できるクッキー数には制限があります。共有サーバなどを使用している場合には特に注意が必要ですが、クッキーの制限数はサーバに対して割り当てられているので、同じサーバを使用している人と共通のものになってしまいます。
1台のサーバPCが1台のクライアントPCに発行できるクッキー数は最大で20個ですが、そう考えるとひとりで20個使い切るわけにもいきません。そういう時に便利なのがクッキー値に配列を利用する方法です。
クッキーの数は1つの変数が1つのクッキーとして数えられます。つまり、配列を使用する事によって変数1つで色々な値を格納できるので、クッキーの制限数をあまり気にしなくて済むようになります。さらに、配列として1つの変数にまとめておく事でクッキー名をいろいろ考えなくて済みますし、1つの変数でまとまった値が管理できるというのは非常に便利です。
クッキーの保存と値の取り出し
配列を利用したクッキーは以下のように書く事ですぐできます。掲示板やメール送信フォームなどには本文以外に名前・E-mail・URLなどの入力項目がありますが今回はその3つを配列を使用したクッキーに格納します。ここでは有効期限は省略しますので適宜付け足して下さい。
- $name = 'そふぃ'; // 名前
- $mail = 'aaa@bbb.com'; // E-mail
- $url = 'http://nyx.pu1.net/'; // URL
- setcookie('my_cookie[0]', $name);
- setcookie('my_cookie[1]', $mail);
- setcookie('my_cookie[2]', $url);
注意したいのは配列のキーをちゃんと指定しないと・・・・・どんどん上書きされてくだけというところだけです。つまり、キーを空にしてsetcookie()を実行すると、配列のキーは、0→1→2・・・とはいかず、0→0→0と上書きになります。つまり、この例だと最後のURL値だけしか残らなくなってしまいます。このような指定方法を取る場合はキーをちゃんと指定しましょう。
クッキー値を取り出したい場合はループを使うと楽です。ここではforeach文を使用してます。foreachに指定した配列が存在しないとエラーになってしまうので、最初にisset()関数で配列の存在をチェックし、存在した場合のみ処理するようにしてます。
- // isset()関数でクッキー値があるかどうかチェック
- if( isset($_COOKIE['my_cookie']) ){
- foreach($_COOKIE['my_cookie'] as $name => $val){
- echo $name." => ".$val."<br />\n";
- }
- }
出力結果
※出力結果が表示されていなければ更新ボタンを押してみて下さい。
参考関数
- isset() ---- 変数がセットされているどうか調べる
書式
- bool isset( mixed var )
応用処理
さて、上記の例ではsetcookie()関数を3回実行してるので、書くのも面倒だし効率も悪そうです。これを解消できる便利な関数を紹介します。クッキーがメインですのであんまり細かくはやりません。
まず、クッキーに保存したい全ての値をタブ\tで区切った1つの文字列にしてしまいます。こうすればクッキーの数も1つで済みますし、取り出す時にはタブ\tを削除すればどうにかなりそうな気がしますね。
イメージとしてはこんなカンジです。
そふぃ(タブ)aaa@bbb.com(タブ)http://nyx.pu1.net/
ここでは区切り文字にタブ\tを使用してますが、カンマ,で区切ろうが半角スペースあたりで区切ろうが別に何でもいいです。但し、区切り文字にはクッキー値に出てこないであろう値を指定しないといけません。例えば今回のスクリプトではURLがあるので、区切り文字に/あたりを使うと変なところで区切られてしまいます。その点だけ注意して区切り文字を決めて下さい。
ここではimplode()という関数を使用しますが、implode()は配列の要素を、指定した文字列(結合文字)で結合してくれるという関数です。今回の結合文字はタブ\tです。つまり、クッキーの値が配列に格納されてればimplode()関数ですぐにタブ区切りの文字列が出来上がります。
参考関数
- implode() ---- 配列の要素を文字列により連結する
書式
- string implode( string glue , array pieces )
そんな訳で、スクリプトは
- クッキーの値を配列に格納
implode()で結合
のような手順になります。
implode()関数を用いたクッキー値の結合
- $name = 'そふぃ'; // 名前
- $mail = 'aaa@bbb.com'; // E-mail
- $url = 'http://nyx.pu1.net/'; // URL
- // 値を配列に格納
- $cookie_array = array($name, $mail, $url);
- // 配列をタブ区切りの文字列に変換
- $cookie = implode("\t", $cookie_array);
- setcookie('my_cookie2', $cookie);
さてこのようにしてクッキー値をタブ区切りの文字列にした場合は、タブ\tを削除して元の配列に戻してもらえるとありがたいのですが、そういった関数もちゃんと用意されています。explode()という関数です。
explode()を使用すると、指定した区切り文字で文字列を分割してくれます。分割した文字列は配列となります。今回は区切り文字にタブ\tを使用しましたのでタブ\tで分割する事になります。
これで1つのクッキー値が配列の1要素として格納される事になるので、値を簡単に取り出せるようになります。今回はforeach文を使用して全て取り出してます。
参考関数
- explode() ---- 文字列を文字列により分割する
書式
- array explode( string separator , string string [, int limit ] )
explode()関数を用いてクッキー値を分割
- if( isset($_COOKIE['my_cookie2']) ){
- $cookie_val = explode("\t", $_COOKIE['my_cookie2']);
- foreach($cookie_val as $value){
- echo $value."<br />\n";
- }
- }





