• 締切済み
  • 暇なときにでも

ボタン押したときだけカウント

http://www.sic.shibaura-it.ac.jp/~p00050/ でホームページを作っています。 左下のほうにあるリンクをクリックしたときだけ、カウントが上がるようにしたいんです。 でも表示更新したときにもカウントが上がってしまいます。 左下の部分のフレームはcount.cgiで、ソースは次のとおり。 #!/usr/local/bin/perl $data = 'data.dat'; open(F, "$data"); $count = <F>; close(F); $count++; open(F, ">$data"); print F "$count"; close(F); print "content-type:text/html\n\n"; print "<body bgcolor=black topmargin=0 leftmargin=0 bottommargin=0 rightmargin=0>\n"; print "<font color=lightgrey size=2><p align=center>ポイント <b>$count</b><br>\n"; print "このページに共感した人は、<br>好きなだけ<a href=count.cgi target=count>ここ</a>を押してください。"; print "</p></font></body>\n";

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数196
  • ありがとう数5

みんなの回答

  • 回答No.6
  • Sephy
  • ベストアンサー率35% (7/20)

まず print << 'END'; Cache-Control: no-cache\n Pragma: no-cache\n Location: count.html\n\n END の部分ですが、改行は \n を使わないでそのまま改行してください。 例 print << 'END'; Cache-Control: no-cache Pragma: no-cache Location: count.html END それと日本語の扱いには注意が必要です。 2バイト文字の場合、どちらかのバイトが " 等の文字と同じだったりすると、Perlはそれを " と解釈してしまいます。 文字の前後に\を置いたりすると解消されます。 解消法の例 ×print"表示"; ↓ ○print"表\示"; 補足 #!/usr/local/bin/perl -w とすると文法エラーなんかに警告を出してくれるようになります。 蛇足 <meta charset=shift-jis> が不明です。 meta要素の属性に charset ってありましたっけ?・・・ 例 <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">

共感・感謝の気持ちを伝えよう!

質問者からの補足

eucで書いているので、2倍と文字が"になることはないのでは。 とりあえずエラーはなくなりましたが、やはり効果はないようで。 しかし、"ここ"をクリックして表示更新すると、このフレームが表示されなくなって、再度このページを表示した後、1度表示更新したら現れる、というこの症状は何でしょう。 とりあえず、count.txt更新しておきました。

関連するQ&A

  • アクセスカウンタでリロード時のカウントされるのをやめたい!

    自分のPCでIIS5.0をインストールして CGIの作成練習をしています。 簡単なアクセスカウンタを作ったのですが、 どっかのをコピーしただけ。。。 sub counter{ #(読込み) open (IN,"<./count.dat"); $raikyaku = <IN>; close (IN); $raikyaku++; #(書き込み) open (OUT,">./count.dat"); print OUT $raikyaku; close (OUT); } これを、更新ボタンを押した時にカウントされない ようにしたいです。 また、BBSに埋め込もうと思っているので、 投稿ボタンで再表示された場合も カウントされてほしくありません。

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

    勉強がてら以下のようなカウンターをつくりたいと思っています。 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
  • ページ訪問時の個別カウントについて

    こんばんは,いつもお世話になっております. Webサイトへのアクセスカウンターを作ってみました. 人がページへ訪問→+1してcount.datに加算→同ページに数値を表示というプロセスです. count.cgi ----------------------------------------- #! usr/bin/perl use CGI::Carp qw(fatalsToBrowser); open(FILE, "+<./count.dat") or die("ERROR"); eval{ flock(FILE, 2); }; $count = <FILE>; #カウントファイルの書き込み seek(FILE, 0, 0); print FILE ++$count; close(FILE); #サーバー出力 print qq[Content-type: text/html\n\n]; print qq[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">]; print qq[<html>]; print qq[<head><title></title></head>]; print qq[<body>]; print qq[$count]; print qq[</body>]; print qq[</html>]; ----------------------------------------- 非常に簡易的なものなのですが,この数値を個人のIPなど,無二の値を用いて識別し,count.datに保存することは可能でしょうか? もちろん個人情報なので出力については考慮したいと思っております. 何か不明な点がございましたら随時対応しますので,よろしくお願い致します.

  • 回答No.5
  • Sephy
  • ベストアンサー率35% (7/20)

×nocache ↓ ○no-cache らしいです。 HTTPについてはあまり詳しくないので わかりませんが・・・ RFCには no-cache と書いてありました。

共感・感謝の気持ちを伝えよう!

質問者からの補足

エラーが解消できません。 http://www.sic.shibaura-it.ac.jp/~p00050/count.txt にソースを置いときます。 あと、表示更新をしたり、ページを初めて開いたばかりのときにカウント部分が表示できなくなってしまうのはなぜでしょう。

  • 回答No.4
  • Sephy
  • ベストアンサー率35% (7/20)

キャッシュを読ませないようにするために Cache-Control: nocache とか Pragma: nocache とかを Location: ~ の前に書いてください。 例 print << 'END'; Cache-Control: nocache Pragma: nocache Location: ~ END

共感・感謝の気持ちを伝えよう!

  • 回答No.3
noname#9414
noname#9414

補足読みました。 「http://...」の部分には、 「http://www.sic.shibaura-it.ac.jp/~p00050/list.html」 と書けばいいでしょう。 しかし、なにやら無駄なループが入っているよう なのですが、可能ならばソースを補足してください。 ではでは☆

共感・感謝の気持ちを伝えよう!

  • 回答No.2
  • Sephy
  • ベストアンサー率35% (7/20)

Kanataさんのやり方で構わないと思います。 とりあえず「回答しろ」と命令されてしまったので別解。(笑) CGIへアクセスがかかったらカウントアップし、 print"Location:count.html\n\n"; のようにしてあらかじめ作っておいたページへ飛ばす。 表示するページにカウント数を表示させたい場合は・・・ 1.HTMLファイルを書き換えてから飛ばす。 2.表示用CGIを別に作ってそのCGIへ飛ばす。 3.HTMLに引数を渡し、JSを使ってそれを表示させる。 ・・・等の方法があります。 3 については私のサイトの「JavaScriptの部屋」を参照していただければと思います。

参考URL:
http://w3.to/sephy

共感・感謝の気持ちを伝えよう!

質問者からの補足

1の方法を試してみました。 HTMLは書き換わっているのですが、その書き変わったHTMLを表示してくれません。 キャッシュでも読みに行っているのでしょうか。 そのあと表示側が自発的に表示更新すると、カウントが上がったHTMLが表示されます。

  • 回答No.1
noname#9414
noname#9414

なるほど、TOPページを表示したときには、 カウントしないで、リンクをクリックしたときに カウントアップするようにしたいのですね? ということは、HTTP_REFERERを使っては どうでしょう。こんな感じです。 if($ENV{'HTTP_REFERER'} eq 'http://...') {  カウントアップ } 確かこんな感じでできるはず。 ではでは☆

共感・感謝の気持ちを伝えよう!

質問者からの補足

http://... の ... の部分には、ソースファイルのURLを書けばいいのでしょうか。 かなり初心者なので、その辺もお願いします。

関連するQ&A

  • 以下のような記述では エラーになります?

    cgi初心者です #!/usr/bin/perl $kinoko='../kino.txt'; open DATA "+<$kinoko"; $mokk=<DATA>; $mokk++; print DATA $mokk; close DATA; print <<END_HTML; <html> <body> <font size="7"> $mokkです </font> </body> </html> END_HTML exit; どこに問題があると考えられるでしょうか

    • ベストアンサー
    • 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
  • データの読み込み方法

    CGI@Perlの質問です。 下記のような内容のdata.txtファイルがあります。 すべてを読み込みブラウザで表示する方法は本により理解をしたのですが、 このスクリプトを改良して、二行目のみを取り出し表示したり、 文字列(例:「ニ」がある行だけを表示)を検索して表示したいと思っています。 どなたかスペシャリストの方、下記のスクリプトに手を加え 分かりやすくご説明していただけないでしょうか? よろしくお願いいたします。 ○全部表示するスクリプト------------------------- #user/local/bin/perl $count = 1; print"Content-type:text/html\n\n"; print<<EOF; <html> <head> <title>テスト</title> <head> <body> EOF open(DATA,"data.txt"); while($count <= 3){ $data = <DATA>; print "$data<BR>"; $count++; } close(MENU); print<<EOF; </body> </html> EOF exit; ------------------------------------- 【data.txt】 一行目のテキスト 二行目のテキスト 三行目のテキスト

    • ベストアンサー
    • CGI
  • cgiのopenについて

    cgiのopenを使って下記のソースを作りました。 が、読み込んだテキストの一行目しか読み込みませんToT require 'cgi-lib.pl'; &ReadParse(*answer); $data = "$answer{'text'}"; require 'jcode.pl'; &jcode'convert(*data,'sjis'); open(dataright,"<data.txt"); $data= <dataright>; close(dataright); print "Content-type:text/html\n\n"; print <<EOF; <html> <head> <title>メール送信フォーム</title> </head> <body> ------------------<br> お知らせ<br> $data ------------------<br> </body> </html> EOF exit; ちなみにテキストは改行に<br>を入力してあります。 ぜひアドバイスをお願いいたします。

    • ベストアンサー
    • CGI
  • カウンタの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
  • 昨日と今日のカウンタについて ご指摘下さい

    昨日と今日のカウンタについて カウンターが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>> 今日の日:昨日のカウント数

    • ベストアンサー
    • Perl
  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 全行読み込むには

    open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; print "$f_data1"; print "$f_data2"; select STDOUT; close( OUT ) or die "Can't close word.js: $!"; 上記スクリプトでは、pass.datの一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。

    • ベストアンサー
    • Perl
  • 番号をつける

    度々の質問で申し訳ないのですが、 ファイルに書き込むときに通し番号を付けたいのですがどうしたら良いか分かりません。 ファイルの行数を数えるのが良いのでしょうか? 良い方法がありましたら、教えてください。 #!c:/perl/bin/perl print "Content-type: text/html\n\n"; require 'cgi-lib.pl'; &ReadParse(\%data); $name = $data{'name'}; $age = $data{'age'}; $sei = $data{'sei'}; $input = $name.$age.$sei; $x=0; open(RF,"<member.dat"); while($line=<RF>){ if((index ($line,$input))>=0){ print "既に登録されています。<BR>"; $x++; } } close(RF); if($x==0){ open(FP,">>member.dat"); <---順番に番号をつけて、保存したい---> print FP $input; print FP "\n"; close(FP); print "<HTML><HEAD>\n"; print "<TITLE>登録完了</TITLE>\n"; print "</HEAD><BODY>\n"; print "<H3>登録完了しました。</H3>"; print "</BODY></HTML>\n"; } exit;

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

    #!/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

専門家に質問してみよう