• ベストアンサー

perl CGIが開くと勝手に処理してしまうのを防ぎたい

BBSを作成中で、そのBBSに記事ナンバーをつけようと奮闘中です。そこで質問があります。Flashを使って作製していますが、CGIの質問は非常に稚拙だと思いますので、お助けください。 記事のナンバーカウントの値がアップする仕組みをCGIファイルに 組み込んだのですが、書き込みボタンが押されていないのに、 最初にページを開いた瞬間に、カウントがアップしてしまう状態になってしまっています。それ以後は、ページを閉じない限りは、書き込みボタンが押されるたびにカウントの値は1ずつきちんと増えていきます。 要するに、ページを開いたときにカウントが1増えるのを防ぎたいのです。 ちょっとうまく伝えにくいのですが、 以下のような仕組みになります。 count.datファイルの中の数値が一つずつあがっていくようになっています。 #----- ファイルを読み込む $countfile = "./count.dat"; #-----カウントの値の読み込み open(COM,"$countfile"); $cnt=<COM>; close(COM); #-----カウントの値に1プラスする $cnt++; open(COM,">$countfile"); print COM $cnt; close(COM); と、以上のような単純な仕組みなのですが、 最後の「カウントの値に1プラスする」という処理が勝手に実行されてしまいます。 CGIファイルの一番下にカウントの値を1プラスする処理を実行するスクリプトを置いたのですが、 最初に実行されてしまうようです。 宜しくお願い致します。

  • shevy
  • お礼率67% (703/1046)
  • CGI
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • kosa
  • ベストアンサー率25% (379/1464)
回答No.2

初めにFLASH側でCGIに記事の取得をしているんですねぇ~ その際にカウントアップされるってことですね。 う~っと 簡単な方法としては2つのCGIを用意する方法です。 1つ目は記事取得のCGI専用 2つ目は記事書き込み専用 どうでしょうか? ※別に2つにしなくても隠しフィールドを利用したり、変数によってCGI側でIF文などで判別する方法もあります。 あんまし参考にならなかったかなぁ?すまそん >これは、かなり非効率なことをしています・・? いや いいと思いますよ。結果オーライですもんねぇ♪

shevy
質問者

お礼

ありがとうございます。 なるほどぉ・・・。。。 二つCGIがあれば、問題は解決しちゃいますよね。 要するに書き込み専用のほうに、 例のカウント値を増加させるコードを書いておけばいいんですね。 早速作ってみようと思います。 ですが、一番気になるのは、 kosaさんがほのめかした隠しフィールドと、 IF文です。IF文は私も考えてみたのですが、 どのように条件分岐させればいいのか、今回のケースでは思いつきませんでした。 ちょろっと教えていただけないでしょうか。 隠しフィールドについては全くわからないので、 そちらもちょろっとお願い致します。

shevy
質問者

補足

kosaさん、ありがとうございます。 2つのcgiでうまく実現できました。 やはりこれが一番簡単なようでした。 ありがとうございました。

その他の回答 (2)

  • karogon
  • ベストアンサー率75% (6/8)
回答No.3

CGIが記事を表示する(FLASHに渡す)処理、書き込み処理を 行っているのであれば、これらをサブルーチンにて分けるなどをしていると思います。 で、あれば書き込み処理を行うサブルーチン内で カウント処理をすればいいのではないでしょうか?

shevy
質問者

お礼

ありがとうございます。 サブルーチンに分けるという処理も、 使えますね。 色々試して行きたいと思います。 ありがとうございました。

  • kosa
  • ベストアンサー率25% (379/1464)
回答No.1

えっとFlash掲示板ってことですよね? >初にページを開いた瞬間に、カウントがアップしてしまう FLASH側で書き込みを押した時にのみCGIを呼び出すようにしていますか? 余計なところでCGIを呼び出しているとか・・・ このCGIではカウントするファイルを掲示板ログとが別々のようですが一緒にした方がのちのち便利ではないでしょうか?(削除記事指定とか)

shevy
質問者

お礼

ありがとうございます。 そうなんです。Flash掲示板です。 Flash側では、まず、LoadAndVarsによって、掲示板の記事を取得するために、CGIにアクセスして、 そこから記事を表示されるという方法をとっておりますので、 どうしても最初はCGIを呼び出さないと駄目な仕組みになっています。 カウントするファイルを別々にしていますが、 書き込み時に、カウントした番号を掲示板ログの先頭に書き込むようにしています。 って、これは、かなり非効率なことをしています・・? 通常、カウントはどのようにして実行していくものなのでしょう。 最初にCGIが実行される仕組みになっていると、 通し番号を実現するのは難しいのでしょうか。 お助けください。

関連するQ&A

  • Perlのファイルオープン時のモードについて。

    初歩の初歩、テキストカウンターを作成しようとして open (CNT,"+<cnt.dat"); $cnt = <CNT>; close(CNT); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); と上記のようなプログラムを書いたのですが、 ファイルに書き込みがなされません。 多少わかりにくい書き方になるかとは思いましたが、 open (CNT,"<cnt.dat"); $cnt = <CNT>; close(CNT); open(CNT,">$cntfile"); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); という風に書きかえてみました。 こちらですと、書き込みはされるのですが何故かカウントが 2つずつカウントされてしまうんです。 プログラムとしておかしな点というのが思い当たらずお手上げです。 ご教授下さい、お願いします。

    • ベストアンサー
    • 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
  • lacoocanにcgiを設置

    lacoocanにアクセス数を表示するcgiを設置しようと思っています。 (1)訪問者数を記録しておくdatファイル (2)訪問者数を読み出し更新するcgiファイル (3)結果をブラウザーに表示するhtmlファイル の3つのファイルを「メモ帳」で作成して、cntというディレクトリに入れます。 lacoocan では、"homepage"というディレクトリにあらゆるファイル、ディレクトリをアップロードすることになっているので、そこに上記のcntディレクトリをアップロードします。 問題は、ここで上記(2)のcgiファイルの中の datファイルの場所を どう記述するかです。 $file = "/homapage/cnt/counter.dat" としているのですが、うまくいきません。 ブラウザーで読み込んでも、カウント数のところはブランクです。 htmlのソースを見ると、 ”訪問者数は、<!--#exec cmd="./counter.cgi" -->です。”となっていて、cgiが正常に動いているのかも定かではありません。 何かアドバイスがありましたら、よろしくお願いいたします。

    • 締切済み
    • CGI
  • CGIのログをHTMLで表示

    CGIのログ(カウント)をHTMLにSSIで表示させようと思い下記のCGIを考えたのですがうまく表示されません。 皆様のお力をお貸し下さい! [log.dat] L内容 DataSu='***'; (***にはカウント数字が入っています) 上のカウントログをHTML表示させる為にCGIを作る [count.cgi] #!/usr/local/bin/perl #カウントログ読み込み open(IN,"ログまでの相対パス"); # カウンターを読み出す $count = <IN>; #ファイルを閉じる close(IN); #サイト数の表示。 print "Content-type: text/html\n\n"; print "$count"; 上記のCGIを表示させるとDataSu='***';とファイル内容が全て表示されてしまいます。 ***のカウント数だけ表示させるにはどうしたらいいのでしょうか?

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

    自分の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こずつではなく、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
  • カウンター設置うまくいかず

    http://www.tohoho-web.com/soft/wcnt.htm#Trouble このカウンター使ってますが、上手く行きません。 cgiは動きます。 cnt dat acc ががそれぞれ存在しませんというエラーが出ます。 パーミッションは間違っておらず、サーバーにもアップしてます。 ファイル名も間違ってません。 原因は何でしょう? cgiのファイルに、 $file_count = "http://www.ほにゃらら/count/$count_name" . ".cnt"; と記述してます。 本来は、$file_count = "$count_name" . ".cnt"; となっていたものを、別のサーバーにファイルを置いたため、このような記述にしてみました。 これ、間違ってますか? こういう書き方はいけないのでしょうか? アドバイス、よろしくお願いいたします。

  • アクセルカウンターの作成

    UNIXの環境でテキスト型のカウンタをつくっているのですが、 どうしたらいいのかわからないところができてしまいました。 $datafile ="./count.dat"; count.datというアクセスの人数をカウントするファイルを作って保存したのですが、どうしてもweb上で実行するときちんと表示されないのです。 このデータは、cgiを保存しているフォルダとかhtmlを保存しているフォルダなどどこに保存するればうまくいくのでしょうか?

    • ベストアンサー
    • Perl
  • Apacheでcgiができないんです。

    以下のホームページと同じように、設定したのですが。。。 http://www.futomi.com/lecture/apache/config.html 下のcgiは実行できます。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD>\n"; print "<TITLE>Apache</TITLE>\n"; print "</HEAD>\n"; print "<BODY>\n"; print "<H2>Welcome to my computer, Apache Server!</H2>\n"; print "</BODY>\n"; print "</HTML>\n"; しかし、下のcgiは実行できません。htmlファイル、cgiファイル共に、あるホームページからコピペしたので、間違いないと思います。ここではhtmlファイルは書きませんが、以下のURLです。 http://www2j.biglobe.ne.jp/~apollo/server/apacuse.html #!/usr/local/bin/perl $countfile= "count.dat"; open(IN, "< $countfile"); $count = <IN>; close(IN); $count++; open(OUT,"> $countfile"); print OUT $count; close(OUT); print "Content-type: text/plain\n\n"; print $count;

    • ベストアンサー
    • CGI
  • CGIのちょっとしたこと

    CGIをいろいろと実験しているのですが、わからないことが2点あります。ローカルな環境で実行しています。 1.データファイル(実行ファイルではない)の拡張子なんですが、data.datとかdata.cgiとかありますよね。セキュリティ的にはcgiの方が安全なんですか?.datだとエディッタで中身がみれてしまうので・・。 2.実行ファィル内にパスワードを記述することがありますよね。そこで、実行形式のprogram.cgiファイルの中身をみられてしまうことがあるのでしょうか?rootにはみられてしまうかもしれないが、通常のユーザーがファイルのソースコードをみれてしまうということはないのでしょうか。私は多分みれないと思うのですが、特殊なソフトウェアなどが存在したりしますか。 3.実行から10秒後にファイルを作成するプログラムがあったとして、このプログラムを実行した直後にブラウザを閉じたとします。しかし、10秒後にはちゃんとファイルが作成されています。ブラウザを閉じてしまってもプロセスは残るものなのでしょうか。 ※プログラムはすべてブラウザで実行しています。

    • ベストアンサー
    • CGI

専門家に質問してみよう