• 締切済み

二重カウント防止

フリーのカウンタに2重カウントを防止出来るようにいろんなHP見て直したのですが、カウンタ自体動作しなくなりました。どこを直せばよいのでしょうか // 連続カウント防止(yes=1 no=0) $ip_check = 1; //------------ここまで---------- $fp = @fopen($log, "r+") or die($log."が開けません"); $count = fgets($fp, 64); //最大64バイトまで読み込む if(($ip_check == 1 && "$ip" != $_SERVER["REMOTE_ADDR"]) || $ip_check == 0){ $cnt++; $new_data = implode("<>", array($cnt,$_SERVER["REMOTE_ADDR"])); } fseek($fp, 0); //ファイルポインタを先頭に移す flock($fp, 2); //書き込みに対しロック fputs($fp, $count); //ファイルに書き込む fclose($fp); //ファイルをクローズ //桁数のフォーマット $cnt = sprintf(sprintf("%%0%dd", $fig), $count); //画像のサイズオプションを0.gifで取得 $size = getimagesize($path."0.gif"); //IMGタグを出力 for ($i=0; $i<strlen($cnt); $i++): //桁数分だけループ $n = substr($cnt, $i, 1); //左から一桁ずつ取得 echo "<IMG SRC=\"$path$n.gif\" alt=$n $size[3]>"; endfor;?>

みんなの回答

  • sisya
  • ベストアンサー率39% (97/244)
回答No.5

#2の補足への返事になってしまいますが、 「素人でも既存のスクリプトの拡張ならさほど難しくはないです」 m-happy-tさんのような 「自分の欲しい機能をなんとか実装したい」と言う気持ちがあれば、 ゆっくりでも確実に理解していけると思います。 ただ、今回のような答え様の無い質問の仕方ですと、 有効回答を得られず、放置される場合が多いので こちらの事も少し考えて頂きたいのです。 ご本人なら当然判っているような事も こちらは全然判らない状態で答えていると言う事です。 「質問するなら最低限の情報は書いてください」 これは技術的質問に限らず、人に何かを尋ねる上での基本だと思います。

m-happy-t
質問者

お礼

本を買ってきました。 呼んで考えます

すると、全ての回答が全文表示されます。
  • sisya
  • ベストアンサー率39% (97/244)
回答No.4

全部推測ですが、 とりあえず ・「$ip」と言う変数に値を代入していない ・「$new_data」を保存していない この2点は問題ですね この元となったスクリプトは 「$_SERVER["REMOTE_ADDR"]をファイルに保存しておき、  既に保存済のipだった場合はカウントをしない」 と言う処理を行っています。 よって下記スクリプトには以下の2点が足りません。 ・カウント済ip一覧を読み込み、すでに記録されているかのチェック ・カウントしたipを保存する処理

すると、全ての回答が全文表示されます。
  • sisya
  • ベストアンサー率39% (97/244)
回答No.3

確かに手段として「追加して動かなくなった」のは理解できました。 ここで質問の仕方を説いても仕方ないのですが、 最低でも以下の情報がなければ答えようがありません。 ・そもそもどこから持ってきた何を追加したのか (1行1行比較すればわかる事なのかもしれませんが) ・どんなエラーが表示されたのか ・動作させている環境 また、以下の情報があると質問した方の理解度が判り、 より教えやすくなると思います。 ・PHPで以前何かを作った経験はあるのか ・そもそも言語を扱ったことがあるのか 質問をする時はまず他の質問を見て どうやって質問しているのかを見てみましょう。 それによって回答とのやり取りから どうやって自力で問題を解決するかが身につきます。 なぜ私が「丸投げ」などという厳しい書き方をしたかを もう少し考えて欲しかったです。

m-happy-t
質問者

補足

・そもそもどこから持ってきた何を追加したのか 元はここの画像カウンターです http://php.s3.to/counter/ 追加した分は、忘れました ・どんなエラーが表示されたのか エラーはありませんが、カウントしません(当たり前ですよね) ・動作させている環境 PHPのバージョンは、4.2.3です ・PHPで以前何かを作った経験はあるのか ありません ・そもそも言語を扱ったことがあるのか ありません 素人には無理であれば、無理と言っていただいて結構です

すると、全ての回答が全文表示されます。
  • sisya
  • ベストアンサー率39% (97/244)
回答No.2

そもそもどういう手段を講じて2重カウントを防止しようとして、動かなくなったのでしょうか? (全く補足なしでデバッグの丸投げはちょっと乱暴すぎるのではないかと)

m-happy-t
質問者

補足

私の利用しているHPスペースはこの画像カウンタ以外は利用できません。本カウンタは重複カウント防止になっていないため、他のカウンタの重複カウント防止と思われるところを以下のカウンタに追加したら動かなくなりました (そんな、ことで動くと思ったら大間違いと指摘されると思ってます) お付き合い頂けるのであれば、よろしくお願いします 設置した無料カウンタの構文は以下のとおりです。 <? //------------設定--------------- // カウンタ画像のあるディレクトリ $path = './gif/'; // カウンタを記録するファイル $log = 'count.txt'; // カウンタの桁数 $fig = 5; //------------ここまで---------- $fp = @fopen($log, "r+") or die($log."が開けません"); $count = fgets($fp, 64); //最大64バイトまで読み込む $count++; //カウントアップ fseek($fp, 0); //ファイルポインタを先頭に移す flock($fp, LOCK_EX); //書き込みに対しロック fputs($fp, $count); //ファイルに書き込む fclose($fp); //ファイルをクローズ //桁数のフォーマット $cnt = sprintf("%0".$fig."d", $count); //画像のサイズオプションを0.gifで取得 $size = getimagesize($path."0.gif"); //IMGタグを出力 for ($i=0; $i<strlen($cnt); $i++){ //桁数分だけループ $n = substr($cnt, $i, 1); //左から一桁ずつ取得 echo "<IMG SRC=\"$path$n.gif\" alt=$n $size[3]>"; }?>

すると、全ての回答が全文表示されます。
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

他の方が回答してくださるかも知れないので、 直接的な答えではなく、「理屈」についてお話しします。 多重カウントを防止する。と言うことはどう言うことでしょうか? 答えはとても簡単でして、多重起動してしまうから、多重カウントしてしまうのですよね。 と、言うことは、多重起動しない様なプログラムを作ればよ良いのです。この様な仕組みのことを「ロック」とか「ファイルロック」とかと言います。この言葉を Google などで検索して頂くと、幾つかの方法論が紹介されたページを見つけることができるでしょう。 対応言語は、Perl である可能性は高いですが、論理は同じです。(PHP が分かる方なら、Perlもなんとなくは分かると思います。(逆も同じ。)) 例えば、処理が始まる時に、ある決まったファイルをオープンし、処理が終了したら削除する仕組みを用意します。 ファイルをオープンする前に、そのファイルが存在しているのか、チェックをします。もし、見つかれば他のプロセスで起動中であることが分かるし、もし存在しなければ多重起動しない可能性が濃厚です。(絶対に多重起動しない。と言う保障はありません。タイミング的に同一タイミングになるケースがありますよね。) もし、ファイルが存在していれば、一定時間待った上で再度ファイルをチェックします。それを複数回実行して、存在していたら、タイムアウトとする。 などとすれば良さそうですよね。(これが、アルゴリズムの全体です。) ファイルをオープンするのではなく、ディレクトリを作るとか。あるファイルの内容を変更する。などと言う方法でも、起動中かどうか、見極めることができそうですよね? もちろん、flook を使っても良いですね。(僕は、使いませんけど。(笑)) これをヒントにプログラムを見直してみましょう。間違えが見つかりますよ。

すると、全ての回答が全文表示されます。

関連するQ&A