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 編資料