昨日と今日のカウンタについて ご指摘下さい

このQ&Aのポイント
  • 昨日と今日のカウンタについて、カウンターが1こずつではなく、4つとか5つとかずつ増えてしまいます。
  • html内の<p>本日の数は<img src="./count.cgi?today">です</p><p>昨日の数は<img src="./count.cgi?yeaday">です</p>を削除すると、ちゃんと1つずつカウントしていきます。
  • プログラムのどこが間違っているのでしょうか?アドバイスをお願い申し上げます。
回答を見る
  • ベストアンサー

昨日と今日のカウンタについて ご指摘下さい

昨日と今日のカウンタについて カウンターが1こずつではなく、4つとか5つとかずつ増えてしまいます。ですが、html内の <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> を削除すると、ちゃんと1つずつカウントしていきます。(count.datの本日のカウント数もちゃんと1こずつ増えるのを確認しました。) プログラムの何処が間違っているのでしょうか?アドバイスをお願い申し上げます。 <<count.cgi>> #!C:\Perl\bin\perl # 昨日と今日のカウントの取得 $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; $logday = <FILE>; close(FILE); ($day, $yesday) = split(/:/, $logday); #それぞれ、今日の日付、昨日のカウント数に分ける open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; $count = <FILE>; #変数countにデータを収納 close(FILE); ($count, $today) = split(/:/, $count); #それぞれ、トータルカウント数、今日の日付のカウント数に分ける # 数をカウント if($day == $mday){ #同日だったなら、トータルと本日のカウントだけ取る。 &totalcount(); }else{ #違っていたら、本日のカウント数を昨日へ、本日のカウントを0に、日にちを修正 $yesday = $today; $today = 0; open (FILE, ">count.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$count\:$today"; flock(FILE,8); close(FILE); open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$mday\:$yesday"; flock(FILE,8); close(FILE); &totalcount(); #その後カウントをとる } # 引数受取 $mode = $ENV{'QUERY_STRING'}; $mode =~ s/\W//g; require "./gifcat.pl"; #画像表示のif文================ if($mode eq "total"){ &total(); }elsif($mode eq "today"){ &today(); }else{ &yestaday();} exit; # ログの更新================================ sub totalcount{ open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); $count++; #トータルカウント数にプラス1 $today++; #同じく本日のカウント数にもプラス1 seek(FILE, 0, 0); print FILE "$count\:$today"; flock(FILE,8); close(FILE); } # カウンタの数字に画像を付ける sub total{ #トータルカウンタ============= @countdata = split(//, $count); foreach $cou(@countdata){ push(@view, "./img-t/$cou.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view); } sub today{ #今日のカウンタ============= @countdatadt = split(//, $today); foreach $coudt(@countdatadt){ push(@viewdt, "./img-d/$coudt.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdt); } sub yestaday{ #今日のカウンタ============= @countdatady = split(//, $yesday); foreach $coudy(@countdatady){ push(@viewdy, "./img-d/$coudy.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdy); } <<count.html>> <html> <head> <title>カウンタ</title> </head> <body> <p>トータルカウント数は<img src="./count.cgi?total">です</p> <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> </body> </html> <<count.dat>> トータル数:本日のカウント数 <<logday.dat>> 今日の日:昨日のカウント数

  • u2122
  • お礼率71% (125/176)
  • Perl
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

> 例えば、ログでは26なのに表示は25のまま。更新するとログは27で表示も27。ログはきちんとカウント > されているみたいですが、HTMLの表示の方が突然2つ増えてしまうという現象が発生します。 「ログでは26なのに表示は25のまま」は画像を送り出した後に $today をインクリメントしていることを示し、 「更新するとログは27で表示も27」は $today をインクリメントした後に画像を送り出していることを示して いると思います。本日のカウント数が正確なのは、count.html?total から呼び出された CGI 内で $count を インクリメントした直後に画像を送り出しているからです。本日のカウント数も同じように、count.html?today から呼び出された CGI 内で $today をインクリメントして画像を送るようにすればすれば直るはずです。 gifcat.pl と gifcat() 関数について私にはわかりませんが、次のプログラムは直すことなくこのままで (たぶん) 実行できると思いますので試してみてください。 #!C:\Perl\bin\perl $ENV{'TZ'} = "JST-9"; require "./gifcat.pl"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; chomp($logday = <FILE>); close(FILE); ($day, $count, $today, $yesday) = split(/:/, $logday); if ($ENV{QUERY_STRING} =~ /total/) { ++$count; open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$day:$count:$today:$yesday\n"; flock(FILE,8); close(FILE); &img_send($count); } elsif ($ENV{QUERY_STRING} =~ /today/) { if ($mday != $day) { $yesday = $today; $today = 0; } ++$today; open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$mday:$count:$today:$yesday\n"; flock(FILE,8); close(FILE); &img_send($today); } else { &img_send($yesday); } sub img_send { @num = split(//, $_[0]); foreach $num (@num) { push(@view, "./img-d/$num.gif"); } print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view); }

u2122
質問者

補足

理屈は分かったのですが、さらに悪化しました。本日も総カウントも「HTMLの表示の方が突然2つ増えてしまうという現象」が発生してしまいました。・・・もう少し自分で勉強してみようと思います。ここまでおつきあい頂きまして、誠にありがとうございました!とても勉強になりました!!

その他の回答 (3)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

$today が狂うのは、count.html の画像のロード順 (count.cgi の実行順) が一定でないのが 原因かもしれません。毎回 total → today の順番で実行されると問題ないのですが、ときどき today → total の順番で実行されると、その場合は $today が前と同じだったり、2増えたり します。これを解消するには、total と today を別々にカウントする必要があります。 #!C:\Perl\bin\perl $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; chomp($logday = <FILE>); close(FILE); ($day, $count, $today, $yesday) = split(/:/, $logday); if ($ENV{QUERY_STRING} =~ /total/) { ++$count; open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$day:$count:$today:$yesday\n"; flock(FILE,8); close(FILE); &total(); } elsif ($ENV{QUERY_STRING} =~ /today/) { if ($mday != $day) { $yesday = $today; $today = 0; } ++$today; open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$mday:$count:$today:$yesday\n"; flock(FILE,8); close(FILE); &today(); } else { &yestaday(); } sub total { ... } sub today { ... } sub yestaday { ... }

u2122
質問者

補足

何度も教えて頂いて誠にありがとうございます。 ですが、本日のカウントだけやはり正常に動かないみたいです。例えば、ログでは26なのに表示は25のまま。更新するとログは27で表示も27。ログはきちんとカウントされているみたいですが、HTMLの表示の方が突然2つ増えてしまうという現象が発生します。段々カウンタらしくなってきたのですが、この現象を回避するには、何をすればよいのでしょうか?再度お知恵をおかし下さい。よろしくお願い申し上げます。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

ファイルの読み書きに関して、いくつか問題があるようです。 > sub totalcount{ > open(FILE, "+<count.dat") || die "File Open Error!\n"; > flock(FILE,2); > > $count++; #トータルカウント数にプラス1 > $today++; #同じく本日のカウント数にもプラス1 > > seek(FILE, 0, 0); > print FILE "$count\:$today"; > > flock(FILE,8); > close(FILE); > } 上記の書き込み方では、$today のデータが狂うときがあります。例えば、現在 1234:56 が書き込まれていて、翌日になったため 1235:1 を書き込んだ場合、$today は 16 に なってしまいます。ファイルを切り詰めて書き込むこともできますが、この場合読み 込みは行っていないので、他のところと同じように書き込みモードでファイルを開い てはどうでしょうか。 open(FILE, ">count.dat") || die "File Open Error!\n"; ... print FILE "$count:$today\n"; もう1つの問題は、ファイルの書き込みの際に改行が書き込まれいないことです。 通常、ファイルの読み込みは行単位に行われ改行を目印に読み込まれます。次の ようにすることをお勧めします。 open (FILE, "<count.dat") || die "File Open Err!-logday.dat\n"; chomp($logday = <FILE>); close FILE; ... open (FILE, ">count.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$count\:$today\n";

u2122
質問者

補足

親切丁寧にお教え頂き誠にありがとうございます。 ですが、すみません。改善されませんでした。相変わらず本日のカウンタがおかしいです。私の記述ミスだと思うのですが、何処が悪いかもう一度指摘して頂いても良いでしょうか? 以下、お2人のご指摘の元修正したプログラムソースです。 <<count.cgi>> #!C:\Perl\bin\perl $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; chomp($logday = <FILE>); close(FILE); ($day, $yesday) = split(/:/, $logday); #それぞれ、今日の日付、昨日のカウント数に分ける open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; chomp($count = <FILE>); close(FILE); ($count, $today) = split(/:/, $count); #それぞれ、トータルカウント数、今日の日付のカウント数に分ける # 数をカウント================ $mode = $ENV{'QUERY_STRING'}; $mode =~ s/\W//g; if($day == $mday){ #同日だったなら、トータルと本日のカウントだけ取る。 &totalcount() if $ENV{QUERY_STRING} =~ /total/; }else{ #違っていたら、本日のカウント数を昨日へ、本日のカウントを0に、日にちを修正 $yesday = $today; $today = 0; open (FILE, ">count.dat") || die "File Open Err!-count.dat\n"; #本日が0になったので記録を修正 flock(FILE,2); print FILE "$count\:$today\n"; flock(FILE,8); close(FILE); open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; #日付と昨日のカウントの記録を修正 flock(FILE,2); print FILE "$mday\:$yesday\n"; flock(FILE,8); close(FILE); &totalcount() if $ENV{QUERY_STRING} =~ /total/; #その後カウントをとる } require "./gifcat.pl"; #画像表示のif文================ if($mode eq "total"){ &total(); }elsif($mode eq "today"){ &today(); }else{ &yestaday();} exit; # ログの更新================================ sub totalcount{ open(FILE, ">count.dat") || die "File Open Error!\n"; flock(FILE,2); $count++; #トータルカウント数にプラス1 $today++; #同じく本日のカウント数にもプラス1 seek(FILE, 0, 0); print FILE "$count\:$today\n"; flock(FILE,8); close(FILE); } # カウンタの数字に画像を付ける sub total{ #トータルカウンタ============= @countdata = split(//, $count); foreach $cou(@countdata){ push(@view, "./img-t/$cou.gif"); } print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view); } sub today{ #今日のカウンタ============= @countdatadt = split(//, $today); foreach $coudt(@countdatadt){ push(@viewdt, "./img-d/$coudt.gif"); } print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdt); } sub yestaday{ #今日のカウンタ============= @countdatady = split(//, $yesday); foreach $coudy(@countdatady){ push(@viewdy, "./img-d/$coudy.gif"); } print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdy); }

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

count.html の中から何度も count.cgi を呼び出して、その都度インクリメントして いるためと思います。クエリ文字列が total のときのみインクリメントするようにす ると直るかもしれません。 if ($day == $mday) { &totalcount() if $ENV{QUERY_STRING} =~ /total/; } else { ... &totalcount() if $ENV{QUERY_STRING} =~ /total/; }

u2122
質問者

補足

回答ありがとうございました!言われてみれば、そのとおりですよね。何度もcount.cgi を呼び出していたので、カウント数がおかしかったんですね。で、kumoz様がおっしゃったように &totalcount() if $ENV{QUERY_STRING} =~ /total/; を記述したみたのですが、トータルカウント数は正常に動くのですが、本日のカウントがおかしいです。何度もカウントを回すと、突然2つ増えたりしてしまいます。 再度教えて頂きたいのですが、本日のカウントも正常に動くようにするには何処を直せばよいでしょうか?よろしくお願い申し上げます。

関連するQ&A

  • カウンターで重複カウントの防止について

    勉強がてら以下のようなカウンターをつくりたいと思っています。 1 画像つきのカウンタである 2 重複カウンタを防止したい 3 昨日と今日のカウンターも表示させたい で、2でけつまずきました。 何がいけないのでしょうか? 以下のプログラムだと更新毎にカウンターが回ってしまいます。 ご指摘下さい。よろしくお願い申し上げます。 #!C:\Perl\bin\perl $flg = 0; #IPアドレスの取得と重複カウントの防止============ $ipadd = $ENV{'REMOTE_ADDR'}; #IPアドレスの取得 open (FILE, "<logcount.dat") || die "File Open Err!-logcount.dat\n"; #データをすべて配列logdataに読み込む @logdata = <FILE>; close(FILE); #取得したIPアドレスと履歴のIPアドレスを比較====== for($i=0; $i<=$#logdata; $i++){ if($ipadd eq $logdata[$i]){ #新規のIPデータと過去ログのIPデータが等しかったら $flg = 1; #合致するのは1つのアドレスのみ } } #==================================================================== # $flg = 0 だったら、数をカウント #==================================================================== open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; #カウントデータの読み込み $count = <FILE>; #変数countにデータを収納 close(FILE); if($flg == 1){ $data = $count; }else{ $data = ++$count; #プラス1をカウント # ログの更新================================== open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); seek(FILE, 0, 0); #.datに上書き保存する為にデータの記位置を調整 print FILE $data; #カウントを記録 flock(FILE,8); close(FILE); # IPアドレスを更新============================= open (FILE, ">>logcount.dat") || die "File Open Err!-logcount.dat\n"; print FILE $ipadd,"\n"; close(FILE); } print $data; #==================================================================== # カウンタの数字に画像を付ける #==================================================================== @count = split(//, $data); foreach $cou(@count){ push(@view, "./img/$cou.gif"); } require "./gifcat.pl"; print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view);

    • ベストアンサー
    • Perl
  • カウンタのcgiについて教えてください。

    カウンタのcgiについて教えてください。 open(File,"+<count.dat")or die("エラー"); eval{flock(File,2);}; $count=<File>; seek(File,0,0); print File++$count; close(File); print<<END; Content-type:text/html <html> <head> <title>タイトル</title></head> <body>$count人目の訪問者です </body> </html> みたいな感じでカウンタのcgiを作りました。 (Perl・Apache) (携帯からなので、見にくい感じはご容赦ください) これを別htmlファイルにiframeで組み込みました。 今は、単純にファイルが開かれたら+1なので、F5などで更新してもカウントされます。 これを同一IPもしくはコンピュータ名からの連続更新はカウントしないようにするのはどのように書き加えればいいのでしょうか? また、総カウント数だけでなく、昨日のカウント数、今日のカウント数、今月、先月などで集計するためにはどのようにすればよいのでしょうか? わかりにくいかと思いますが、お願いいたします。 m(__)m

    • ベストアンサー
    • CGI
  • テキストカウンターができない詳しい人教えて!

    #!/usr/bin/perl # 読み書きモードでファイルオープン # オープンできないときは強制終了 open(COUNT, "+<countdata") || die "File 'countdata' Open Error."; # ファイルをロックする #flock(COUNT,2); # ファイルから一行読みこむ $counter = <COUNT>; # カウントアップ $counter_new = $counter + 1; # ファイルポインタを先頭に戻す seek(COUNT, 0, 0); # ファイルに出力=書き込み print COUNT "$counter_new?n"; # ファイルクローズ close(COUNT); # ファイルロックを解除する #flock(COUNT,8); # ------- 出力はここから ------- # print "Content-type: text/html?n?n"; print << "END_OF_HTML"; <HTML> <BODY> <CENTER> <FONT size="6"><B> ようこそ<BR> あなたは<FONT color="red"> $counter_new </FONT>人目のお客様です </B></FONT> </CENTER> </BODY> </HTML> END_OF_HTML をcounter.cgiに保存してcountdataに0と打ち込んでwebサーバーにアップしましたが500エラーで見れません CGIの本通りに行いましたができませんサポートページもなく困っています ソースミスなどここが違うなどあったら教えて下さい あとパーミッションなども御願いします

    • ベストアンサー
    • CGI
  • アクセスカウンタについて

    #!/usr/local/bin/perl # カウントファイルの読み込み open(IN, "<./count.dat"); $count = <IN>; close(IN); ++$count; # カウントファイルへの書き込み open(OUT, ">./count.dat"); print OUT $count; close(OUT); # サーバ出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>Perlあくせすかうんたー</title></head> <body> <p>あなたは……$count番目の訪問者です。</p> </body> </html> END 以上のように書きcount.datを作成して同じディレクトリ内においたのですが、カウントが1から増えません。サーバがいけないのか、スプリクトがわるいのかよくわかりません;; ちなみにサーバはlinuxで構築しています。

    • ベストアンサー
    • Perl
  • flockが使えない場合のスクリプトを教えて下さい

    こんにちわ。私はwindows meなのですがflockが使えないようなのでその場合はどのようなスクリプトで表現したらよいのか方法があったら教えて下さい。このflockの部分に代わるものを教えて下さい、又他の方法があればアドバイス下さい。宜しくお願いします。 open(COUNT,"+<countdata.txt") || die "File'countdata.txt'Open Error\n"; #flock(COUNT,2); $counter=<COUNT>; $counter_new=$counter+1; print"$counter_new\n"; seek(COUNT,0,0); print COUNT"$counter_new\n"; close(COUNT); #flock(COUNT,8);

    • ベストアンサー
    • Perl
  • perl初心者 「カウンタ」の2

    「とほほ」さんのgif画像連結ライブラリを使ってカウンタを作成中、行き詰ってしまいました。 下のスクリプトはあるサイトで配布されているカウンタのスクリプトの一部です。 1 while (length($count) < $fig) { $count = '0' . $count; } 2 $length = length($count); 3 @GIF=(); 4 foreach (0 .. $length-1) { 5 $n = substr($count,$_,1); 6 push(@GIF, "$imgdir/$n\.gif"); 7 } 8 9 print "Content-type: image/gif\n\n"; 10 binmode(STDOUT); 11 print &gifcat'gifcat(@GIF); * $figはカウンタ表示桁数です。 * $imgdirはカウンタ画像のディレクトリです。 このスクリプトを組み込んだらうまいことカウンタを表示することができました。 でもスクリプトの理解ができず悩んでいます。 お暇がありましたらぜひ教えてください。

  • テキストカウンターのエラー 詳しい方教えて!!

    ttp://up.kabubu.net/cgi/img2/15270.zip これがソースですフレーム分割してテキストカウンターを表示させるやつです 一週間でマスターするCGI for Macintoshについてきたものです 本通りにやってもできません ローカルのアパッチでも試しましたが webサーバーだと500エラーがでました 本にはサポートページもありませんでした 一応ソースのせます #!/usr/bin/perl open(COUNT, "+<countdata") || die "File 'countdata' Open Error."; flock(COUNT,2); $counter = <COUNT>; $counter_new = $counter + 1; seek(COUNT, 0, 0); print COUNT "$counter_new?n"; close(COUNT); flock(COUNT,8); print "Content-type: text/html?n?n"; print << "END_OF_HTML"; <HTML> <BODY> <CENTER> <FONT size="6"><B> ようこそ<BR> あなたは<FONT color="red"> $counter_new </FONT>人目のお客様です </B></FONT> </CENTER> </BODY> </HTML> END_OF_HTML ソースミスを指摘してもらいましたが 自分でやるとエラーがでるので どなたかエラーがでないようにソースを直して下さい あとパーミッションも御願いします 本にのってた通りのパーミッションでは ファイル countdataは606 counter.cgiは705 main.htmlは404 index.htmlは404 briage.gifは404 となっております ディレクトリの名前はcounterです パーミッションは755 ソースエラーを指摘されましたが難しいのでどなたか動作確認できてから書き直して載せて下さい御願いします

    • ベストアンサー
    • CGI
  • クリックカウンタで隠しページにジャンプさせたい

    クリックカウンタについて教えて下さい。 (1)ある特定のカウント(例えば10)になったら隠しページに飛ばしたい (2)その後は何度クリックしてもカウント数はかわらない(動作させない) (3)その後カウントをクリアして再度クリックカウント出来るようにしたい (1)はなんとか出来ました。ですが、その後の動作が上手く出来ません。どなた様かアドバイスをお願い申し上げます。 <<click.cgi>> #!C:\Perl\bin\perl #=================================================== # 各種設定 #=================================================== $lockfile = "./lock"; $jumpurl = "./blog.html"; #ジャンプさせたい隠しページのURL $hikaku = 9; #日時の取得------------------------------ @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$week,$yday,$sammer) = localtime; $year += 1900; $mon += 1; $yday = ""; $sammer = ""; $now = "$year年$mon月$mday日($youbi[$week]) $hour:$min-$sec秒\n"; #=================================================== # カウントアップ #=================================================== $url = $ENV{'QUERY_STRING'}; &lock; #ログファイルからデータの読み込み---------- open (IN,"<cntdata.dat") || die "Open Error!\n"; $cnt = <IN>; close IN; if($cnt >= $hikaku){ open (FILE, ">text.dat") || die "Open Error!\n"; print FILE "$now<br />10クリックを超えました。ご利用ありがとうございました。"; close FILE; open (OUT,">cntdata.dat") || die "Open Error!\n"; $cnt = 1; print OUT $cnt; close OUT; print "Location: $jumpurl\n\n"; exit; } #記録の更新-------------------------------- $cnt++; #カウントアップ $count = sprintf("%04d", $cnt); open (OUT,">cntdata.dat") || die "Open Error!\n"; print OUT $count; close OUT; &unlock; print "Location: $url\n\n"; #元のページにジャンプさせる exit; #=================================================== # エラーと排他処理サブルーチン #=================================================== sub lock { $retry = 3; if (-e $lockfile) { $locktime = (stat($lockfile))[9]; if ($locktime < time - 60) {&unlock;} } while (!mkdir($lockfile, 0755)) { if (--$retry < 0) {&error;} sleep(1); } } sub unlock {rmdir($lockfile);} <<cntdata.dat>> クリック数 <<text.dat>> 日時とありがとうメッセージ <<index.shtml>> <html> <head> <title>サンプル</title> </head> <body> <a href="./click.cgi?./index.shtml">クリック</a> <p>現在のクリック数:<!--#include file="./cntdata.dat"--></p> <p><!--#include file="./text.dat"--></p> </body> </html> 10クリック超えて、カウンタの数字が1に戻るのですが、その後またクリックすると動きません。なので、(3)にしたい場合には何をすればよいのでしょか。また(3)が無理なら(2)のようにクリックしてもcgiを動作しないようにしたいです。

    • ベストアンサー
    • Perl
  • 初歩的なアクセスカウンタ作成で

    perlを学びはじめて間もない初心者です。よろしくお願いします。 書籍を参考にしながらperlを学んでいます。書籍の中のアクセスカウンタを作ってみるという部分で、下記のスクリプトを書き試してみたのですが、アクセスカウンタが加算されません。1のままとなっています。 何が問題であるのか全く見当がつかないのですが、まず何からチェックして行けばよいのでしょうか? アドバイスやご教授をいただけたらと思います。 よろしくお願いします。 それから環境は、http://www.futomi.com/lecture/macosx/index.html​ を元にMacOS X での Apache サーバーでのローカルでテスト環境 で試し低ます。 # カウントファイルの読み込み open(IN, "<./count.dat"); $count = <IN>; close(IN); ++$count; # カウントファイルの書き込み open(OUT, ">./count.dat"); print OUT $count; close(OUT); # サーバー出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>あくせすかうんたー</title></head> <body> <p>あなたは……$count番目の訪問者です。</p> </body> </html> END

    • ベストアンサー
    • CGI
  • カウンター 増えないのは?

    お世話になります。 下記、サンプルを参考にちょっとカウンターのスクリプトを書いてみたのですが、どうもカウントがアップしません。 どこがおかしいのかご指摘いただけると幸いです。 <?php //カウンターファイル $cnt_file = "count.dat"; //カウンター桁数 $cnt_len = 10; //カウンターファイルが存在すればカウンター値を読取る if(file_exists($cnt_file)){ $file = fopen($cnt_file, "r+"); $conut = fgets($file, $cnt_len); $count = $count + 1; } //ファイルなし新規作成 else { $file = fopen($cnt_file, "w"); $conut = 1; } //ファイルポインタを先頭にセットする rewind($file); //ロック flock($file, LOCK_EX); //書きこみ fputs($file, $conut, $cnt_len); //ロック解除 flock($file, LOCK_UN); //閉じる fclose($file); ?>

    • ベストアンサー
    • PHP