SAK 図書館
CGI-Perl 基礎実地編 - 実習15 (クッキー)
■test15.cgi
------ ↓ ここから ↓ ------
#!/usr/local/bin/perl
#// 準備
$cknm = 'test15';
$test = 0;
#// クッキー取得
if ($ENV{'HTTP_COOKIE'}) {
*data = GetCookie($ENV{'HTTP_COOKIE'});
@w = split(/\,/, $data{$cknm});
$test = @w[0];
}
#// クッキー値加算
$test++;
#// クッキーセット
$ckrec = "$test\,";
#($secg, $ming, $hourg, $mdayg, $mong, $yearg, $wdayg) = gmtime(time + 60);
#@mons = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
#@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
#$dt= sprintf("%s\, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wdayg], $mdayg, $mons[$mong], $yearg+1900, $hourg, $ming, $secg);
print "Content-type: text/html\n";
#print "Set-Cookie: $cknm=$ckrec; expires=$dt;\n\n";
print "Set-Cookie: $cknm=$ckrec;\n\n";
#// HTML 出力
print "<HTML>\n";
print "<P>クッキー test = $test</P>\n";
print "</HTML>\n";
#// 終了
exit(0);
#//=====================================================================
#// クッキー取得
#//=====================================================================
sub GetCookie
{
local($cookie) = $ENV{'HTTP_COOKIE'};
local(*data, @cookie, $key, $val);
#// クッキー取得
@cookie = split(/ /, $cookie);
foreach (@cookie) {
($key, $val) = split(/=/);
$data{$key} = $val;
}
#// 戻り値セット
return *data;
}
------ ↑ ここまで ↑ ------
■解説
・この test15.cgi は、クッキーを使って数値データを維持しています。
リロードするたびに +1 加算されたデータがブラウザに表示されます。
尚、ブラウザを終了するとクッキーは消滅します。
ブラウザ終了後もクッキーを維持する場合は、有効期間を設定します。
$cknm = 'test15';
|_ クッキーの名前
$test = 0;
|_ 数値データ初期値
#// クッキー取得
if ($ENV{'HTTP_COOKIE'}) {
|_ クッキーが有効なら、真の条件を処理
*data = GetCookie($ENV{'HTTP_COOKIE'});
| |_ 自作のクッキー取得関数です
|_ $data{} ハッシュ変数にクッキーデータを格納
@w = split(/\,/, $data{$cknm});
| | | |_ $data{'test15'} のデータを参照
| | |_ カンマ「,」でクッキーデータを分解
| |_ 文字列分解関数
|_ @w[0] 〜 [??] へクッキーデータを格納
$test = @w[0];
|_ $test にクッキー値をセット
#// クッキー値加算
$test++;
|_ 初回は 0 なので、1 になる。
クッキーからデータを受け取ってたら 1++ で 2、3、4... と加算される。
#// クッキーセット
$ckrec = "$test\,";
| | |_ カンマ「,」
| |_ クッキーにセットする値
|_ カンマで区切ったクッキーデータ
#($secg, $ming, $hourg, $mdayg, $mong, $yearg, $wdayg) = gmtime(time + 60);
| |_ 60 秒間クッキーを保存
|_ クッキーに有効期間を持たせるとき、注釈の # マークを取る
#@mons = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
|_ クッキーに有効期間を持たせるとき、注釈の # マークを取る
#@week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
|_ クッキーに有効期間を持たせるとき、注釈の # マークを取る
#$dt= sprintf("%s\, %02d-%s-%04d %02d:%02d:%02d GMT", $week[$wdayg], $mdayg, $mons[$mong], $yearg+1900, $hourg, $ming, $secg);
|_ クッキーに有効期間を持たせるとき、注釈の # マークを取る
#print "Set-Cookie: $cknm=$ckrec; expires=$dt;\n\n";
| |_ クッキー有効期間
|_ クッキーに有効期間を持たせるとき、注釈の # マークを取る
print "Set-Cookie: $cknm=$ckrec;\n\n";
| | | |_ クッキーデータ
| | |_ クッキー名
| |_ HTML レスポンスヘッダ(<HEAD> とは別) にクッキーを出力
|_ 上の print "Set-Cookie: $cknm=$ckrec; expires=$dt;\n\n"; を
使うときは、こっちを注釈にするため # をつけること。
#//=====================================================================
#// クッキー取得
#//=====================================================================
sub GetCookie
|_ クッキー取得関数です。
■補足
・この例では、クッキーデータの区切りにカンマを使用しているので、
データにカンマが含まれる場合、なんらかの処置が必要です。
また日本語データを扱うときも対処が要ります。
w_s3mbix.cgi を解析すれば、私の対処法はわかります。
・クッキーをヒアドキュメント形式で出力しても上手く書けないようです。
気をつけましょう。
■実地
・test15.cgi も実際に作成してテストしてみましょう。
何回かリロードしてみたり、ブラウザを一度終了してから、再起動するなど
して、クッキーの動きを理解しましょう。
・test15.cgi 標準ではクッキーはブラウザの起動中しか有効でありません。
クッキーの有効期間設定によるテストもしてみましょう。
■CGI-Perl 基礎実地編資料
■CGI-Perl 基礎編資料
■CGI-Perl 応用実地編資料
■PHP 基礎編資料
■PHP + MySQL 編資料