クッキーの使い方
クッキーはデータをブラウザ側に保存して読み出す機能です。
例えば、掲示板で一度入力したデータを自動的に表示する場合などに使われます。

<クッキーの保存>
 クッキーはデータ書き込み時に保存します。
 クッキーをブラウザ側へ保存するには、下記のSet-Cookieというヘッダー情報を記述します。
 この情報はヘッダーの区切りを示す空行の前に出力しなければなりません。
  Set-Cookie: name=data; expires=date;
     name データを区別する為に任意の名前を付けます。
     data 保存するデータ
     date クッキーの有効期限を下記のように記述します。
       wday, mday-mon-year hour:min:sec GMT  (例) Sun, 02-Apr-2003 12:00:00 GMT
        wday:曜日 Sun,Mon,Tue,Wed,Thu,Fri,Sat
        mday:日 01〜31
        mon :月 Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
        year :西暦年
        hour:時 00〜23
        min :分 00〜59
        sec :秒 00〜59
       GMTはグリニッジ標準時間を表します。

<クッキーの読み出し>
 クッキーは複数のCGIからのデータが環境変数HTTP_COOKIEに自動的にセットされます。
 複数のクッキーはHTTP_COOKIEに下記のように「; 」で区切られてセットされます。
   name=data; name=data; ・・・
 CGIでその環境変数を読み出し、クッキーを保存した時の名前のデータを取り出します。
 但し、データ書き込み時はその書き込みデータをクッキーとする必要があります。
 これは、環境変数はCGIを実行する前にセットされている為です。
■プログラム (sample19.cgi)
#!/usr/bin/perl
@pair = split(/&/,$ENV{'QUERY_STRING'});
foreach (@pair) {
($n,$val) = split(/=/);
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$in{$n} = $val;
}
$mode = $in{'mode'};
if ($mode eq 'reg') {&setcook;}
print "Content-type: text/html\n\n";
print "<html><body>\n";
&getcook;
print "<form action=\"sample19.cgi\">\n";
print "<input type=hidden name=mode value=\"reg\">\n";
print "<input type=text size=30 name=data1 value=\"$data1\"><br>\n";
print "<input type=text size=30 name=data2 value=\"$data2\"><br>\n";
print "<input type=submit value=\"入力\"></form>\n";
print "$data1<br>$data2";
print "</body></html>\n";
exit;
###
sub setcook {
my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+30*24*60*60);
$wday = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday];
$mon = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon];
$expire = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",$wday,$mday,$mon,$year+1900,$hour,$min,$sec);
$cook = "$in{'data1'},$in{'data2'}";
print "Set-Cookie: sample=$cook; expires=$expire;\n";
}
sub getcook {
my($n,$val,@pair);
@pair = split(/;\s*/,$ENV{'HTTP_COOKIE'});
foreach (@pair) {($n,$val) = split(/=/); $cook{$n} = $val;}
($data1,$data2) = split(/,/,$cook{'sample'});
if ($mode eq 'reg') {$data1 = $in{'data1'}; $data2 = $in{'data2'};}
}
■実行結果



太郎
東京


HOME Copyright (C) CGI-design All Rights Reserved.