参考書を手にしながら次のように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;
No.2ベストアンサー
- 回答日時:
とりあえず。
・クッキーを読み出す箇所はあるが保存する箇所がない
・Print (先頭大文字)になってる箇所がある
この回答への補足
本で確認したのですが・・・
「クッキー情報をnameとvalueに分解して、name属性に当たる部分に[count]という文字列と一致するものがあれば、以前にクッキーに格納した個人のアカウント数であるとする」
そして、
「新しいカウント数をクッキーにセットするのに、HTTPヘッダで行う」
とあります。
この部分は、
print "Set-cookie: count=$count; expires=$expireDate \n\n";
ということらしいです・・・
有難う御座います。
・Print (先頭大文字)になってる箇所がある<<
すみません。本当の基本を間違っていまして・・・。何度も見直したつもりだったのですが・・・。
大文字を小文字に変えたところ、エラー500というCGIページが表示されなかった状態から、見事にページ自体が表示される状態へとなりました。
が、しかし・・・
・クッキーを読み出す箇所はあるが保存する箇所がない<<
まさしくこの通りか、cookieの設定を有効にしたにもかかわらず、何度訪問しても「1回目のご訪問」と表示されてしまいます。
保存の方法を調べてみます。
No.4
- 回答日時:
≫本を確認し変更したところ、無事、訪問回数が表示されるようになりました。
≫でも、その意味合いが良く分かっていないのですが・・・。
≫あなたは1回目のご訪問です。
・・・【中略】・・・
≫$cookie
≫count=1
≫$key
≫count
≫$value
≫1
≫$count
≫1
CGIの修正方法の原則は途中過程を表示させてミスの場所を探すということです。ですから、私が提示した方法は必須のテクニックです。
うまくカウントしなかった原因は、
if( $key == ""){
$count = 0;
}
$count++;
ですよね。$keyではなく、$countの値をチェックしないとなりません。だとすると
if ($count == "" || $count ==0){
等のほうが・・
>>CGIの修正方法の原則は途中過程を表示させてミスの場所を探すということです。ですから、私が提示した方法は必須のテクニックです。
●途中過程を表示させるようなテクニックが欲しかったので、今回は大変いい情報を得ることができました。ありがとうございます。
これから、途中経過を表示させミスを発見しながらCGI作らせていただきます。
No.3
- 回答日時:
sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", ...
の部分、Perlのバージョンによりまずいかも。
"\" が必要なのは "," や "-" の直前では無く "%" の直前です。
あるいは、引用符を 「"」から「'」に替えれば "\" はいりません。
さらにあるいは、この様な日時表現の生成は、 HTTP::Date.pm が面倒をみてくれますよ。
有難う御座います。
>>"\" が必要なのは "," や "-" の直前では無く "%" の直前です。
・本が全部正しいってわけじゃないんですね。アドバイスを色々試してみたいと思います。
もっともっと勉強していきますので、またよろしくお願いいたします。
No.1
- 回答日時:
どう動かないの?
予想は立ちますが、そのまえに
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回目となります。
====
if( $key == ""){
$count = 0;
}
$count++;
====
の部分を
====
if( $count == ""){
$count = 0;
}
$count++;
====
本を確認し変更したところ、無事、訪問回数が表示されるようになりました。
でも、その意味合いが良く分かっていないのですが・・・。
おかげさまで解決いたしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlで書いたcgiでsqliteの使い...
-
VBAで条件から範囲を指定して色...
-
エクセルで集計したい。
-
一番簡単なCGI,掲示板の設置教...
-
フォームを再送信しますか?
-
apacheでPerl CGIが作動せず、5...
-
CGIが読み書きするデータファイ...
-
CGIって何ですか?簡潔に教えて...
-
ラズパイでのCGIで、pythonソー...
-
入力フォーム(電話番号)
-
cgi perl 同じ変数で一つはカン...
-
テキストエリアの<br />を非表...
-
めちゃきれい
-
number 改行が追加できない
-
生成AI画像について
-
3DCG
-
ホームページにメールフォーム...
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで集計したい。
-
フォームを再送信しますか?
-
apacheでPerl CGIが作動せず、5...
-
ホームページでCGIのフォームを...
-
生成AI画像について
-
/bin/awk '{print $5}'ってどう...
-
入力フォーム(電話番号)
-
(フリーの)ツリー掲示版CGI、...
-
古ーくからフリーのtree.cgi掲...
-
VBAで条件から範囲を指定して色...
-
ホームページにメールフォーム...
-
一番簡単なCGI,掲示板の設置教...
-
CGIって何ですか?簡潔に教えて...
-
サーバーのエラーでおしえてく...
-
サイト訪問者の情報を取得したい
-
htmlからパラメータで、cgiに渡...
-
CGIで出力するhtmlの<!DOCTYPE ...
-
cgiからsendmailを送信で文字化け
-
POSTメソッドの最大容量について
-
ホームページにCGIを設置したの...
おすすめ情報