SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK