プロが教えるわが家の防犯対策術!

参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。
個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。

いろいろ調べたのですが、どこが間違っているのか分からなくなりました。
どうぞお願いいたします。

=======

#!/usr/local/bin/perl

$cookie = $ENV{'HTTP_COOKIE'};
@array = split(/; /, $cookie);
foreach $tmp (@array){
($key, $value) = split(/=/, $tmp);
if($key eq 'count'){
$count = $value;
}
}

if( $key == ""){
$count = 0;
}
$count++;

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30);
@day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat");
@month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec");
$expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec);

print "Content-Type: text/html\n";
print "Set-cookie: count=$count; expires=$expireDate \n\n";
Print "<html>\n";
Print "<title>counter4</title>\n";
print "<body>\n";
print "<h1>個人別カウンター</h1>\n<hr />";
print "あなたは$count回目のご訪問です。\n";
print "</body>\n";
print "</html>";

exit;

A 回答 (4件)

とりあえず。


・クッキーを読み出す箇所はあるが保存する箇所がない
・Print (先頭大文字)になってる箇所がある

この回答への補足

本で確認したのですが・・・

「クッキー情報をnameとvalueに分解して、name属性に当たる部分に[count]という文字列と一致するものがあれば、以前にクッキーに格納した個人のアカウント数であるとする」
そして、
「新しいカウント数をクッキーにセットするのに、HTTPヘッダで行う」
とあります。
この部分は、
print "Set-cookie: count=$count; expires=$expireDate \n\n";
ということらしいです・・・

補足日時:2009/01/21 16:47
    • good
    • 0
この回答へのお礼

有難う御座います。

・Print (先頭大文字)になってる箇所がある<<
すみません。本当の基本を間違っていまして・・・。何度も見直したつもりだったのですが・・・。
大文字を小文字に変えたところ、エラー500というCGIページが表示されなかった状態から、見事にページ自体が表示される状態へとなりました。

が、しかし・・・
・クッキーを読み出す箇所はあるが保存する箇所がない<<
まさしくこの通りか、cookieの設定を有効にしたにもかかわらず、何度訪問しても「1回目のご訪問」と表示されてしまいます。
保存の方法を調べてみます。

お礼日時:2009/01/21 16:31

≫本を確認し変更したところ、無事、訪問回数が表示されるようになりました。


≫でも、その意味合いが良く分かっていないのですが・・・。
≫あなたは1回目のご訪問です。
・・・【中略】・・・
≫$cookie
≫count=1
≫$key
≫count
≫$value
≫1
≫$count
≫1

 CGIの修正方法の原則は途中過程を表示させてミスの場所を探すということです。ですから、私が提示した方法は必須のテクニックです。

 うまくカウントしなかった原因は、
if( $key == ""){
$count = 0;
}
$count++;
 ですよね。$keyではなく、$countの値をチェックしないとなりません。だとすると
if ($count == "" || $count ==0){
等のほうが・・
    • good
    • 0
この回答へのお礼

>>CGIの修正方法の原則は途中過程を表示させてミスの場所を探すということです。ですから、私が提示した方法は必須のテクニックです。
●途中過程を表示させるようなテクニックが欲しかったので、今回は大変いい情報を得ることができました。ありがとうございます。

これから、途中経過を表示させミスを発見しながらCGI作らせていただきます。

お礼日時:2009/01/21 20:00

sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", ...



の部分、Perlのバージョンによりまずいかも。

"\" が必要なのは "," や "-" の直前では無く "%" の直前です。

あるいは、引用符を 「"」から「'」に替えれば "\" はいりません。

さらにあるいは、この様な日時表現の生成は、 HTTP::Date.pm が面倒をみてくれますよ。
    • good
    • 0
この回答へのお礼

有難う御座います。

>>"\" が必要なのは "," や "-" の直前では無く "%" の直前です。
・本が全部正しいってわけじゃないんですね。アドバイスを色々試してみたいと思います。

もっともっと勉強していきますので、またよろしくお願いいたします。

お礼日時:2009/01/21 19:57

どう動かないの?



予想は立ちますが、そのまえに
print "<body>\n";
print "<h1>個人別カウンター</h1>\n<hr />";
print "あなたは$count回目のご訪問です。\n";
print "</body>\n";
print "</html>";
の部分を
print "<body>\n";
print "<h1>個人別カウンター</h1>\n<hr />";
print "<p>あなたは$count回目のご訪問です。</p>\n";
#ここから・・
print "<ol>\n";
print "<dt>\$cookie</dt>\n";
print "<dd>$cookie</dd>\n";
@array = split(/; /, $cookie);
foreach $tmp (@array){
($key, $value) = split(/=/, $tmp);
print "<dt>\$key</dt>\n";
print "<dd>$key</dt>\n";
print "<dt>\$value</dt>\n";
print "<dd>$value</dd>\n";
}
print "<dt>\$count</dt>\n";
print "<dd>$count</dd>\n</dl>\n";
# 追加こまで
print "</body>\n";
print "</html>";

のように、処理過程を出力させてみるのが一番早い解決方法です。

その結果を・・・

この回答への補足

有難う御座います。

アドバイスを通り追加したところ、以下のような表示となりました。

====
個人別カウンター

--------------------------------------------------------------------------------

あなたは1回目のご訪問です。

$cookie
count=1
$key
count
$value
1
$count
1
=====

>>どう動かないの?
すみません、言葉足らずでした。以前は全く表示されなかったのですが、printのPが大文字だったのを小文字に変えると、上記のように表示されるようになりました。

が、クッキーを有効にしても訪問回数は常に1回目となります。

補足日時:2009/01/21 16:31
    • good
    • 0
この回答へのお礼

====
if( $key == ""){
$count = 0;
}
$count++;
====
の部分を
====
if( $count == ""){
$count = 0;
}
$count++;
====
本を確認し変更したところ、無事、訪問回数が表示されるようになりました。
でも、その意味合いが良く分かっていないのですが・・・。

おかげさまで解決いたしました。

お礼日時:2009/01/21 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!