Entry

moguraで画像カウンタが表示されない件

XREAサーバでmoguraというアクセス解析ソフトを使おうと思ったら、なぜか画像カウンタが表示されなかった。
今の今まで放置していたけど、最近どうしても使いたくなったのでソースをちょっと調べてみた。そしたら、妙なところで引っかかっていた。

変更前

433 : 		//カウンター増加
434 : 		if($write_flg && !$u){
435 : 			$res = $db->query("SELECT * FROM ".constant("DB_COUNTER")." WHERE counter_date = '".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."' LIMIT 1;");
436 : 			if($res->numRows()){
437 : 				$db->query("UPDATE ".constant("DB_COUNTER")." SET counter_val=counter_val+1 WHERE counter_date = '".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."';");
438 : 			}else{
439 : 				$db->query("INSERT INTO ".constant("DB_COUNTER")." (counter_date,counter_val) VALUES ('".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."',1);");
440 : 			}
441 : 		}

変更後

433 : 		//カウンター増加
434 : 		if($write_flg && $res->fetchRow()){
435 : 			$res = $db->query("SELECT * FROM ".constant("DB_COUNTER")." WHERE counter_date = '".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."' LIMIT 1;");
436 : 			if($res->fetchRow()){
437 : 				$db->query("UPDATE ".constant("DB_COUNTER")." SET counter_val=counter_val+1 WHERE counter_date = '".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."';");
438 : 			}else{
439 : 				$db->query("INSERT INTO ".constant("DB_COUNTER")." (counter_date,counter_val) VALUES ('".gmdate("Y-m-d", time()+constant("TIME_DIFF")*3600)."',1);");
440 : 			}
441 : 		}

PHPもろくに読んだことないし、ろくなデバッグ環境も持ってないから、試行錯誤しながらも何とか見つけ出した。このソフトはPEARというライブラリを使っているので、その点で余計に手間がかかった。

修正箇所はデータベース絡みの処理。データベースからSELECTで取ってきたレコードに対して、numRows()を使用する部分。レコードにデータが挿入されていれば何の問題もないのだけど、空のレコードに対してnumRows()関数を使用すると「0」ではなく「1」が返ってくる。ちなみに1個の場合も「1」が返ってくる。
処理中では、空レコードに対してnumRows()の結果に「0」が返ってくることを期待しているため、問題が発生してしまう。そこで、fetchRow()関数を用いてレコードの有無の判定を行うように変更してやる。これで、見かけ上まともに動くようにはなった。多分。

それにしても、何なんだこの妙な動きは。バグというか、環境の違いみたいなものだろうか。


Comments (5 件)

ジン より:

はじめまして。
moguraで画像カウンタが表示されない件は私自身も悩んでいたため、大変参考になりました。ありがとうございます。
同時にmoguraのカウント値を任意の値にカウントアップさせるPHPスクリプトも利用させていただきました。
それで図々しい事にもう一つお尋ねしたい事があるのですが、writelog.phpを書き換えカウンタが動くようにはなったのですが、二重カウントの防止にはconfigの「同一HOSTからの同ページに対してのアクセスを保存しない」を変更する以外の方法はないでしょうか?
コメントが不適当でしたらお手数ですが削除してくださいm(_ _)m

海水瓜 より:

質問の意図が今ひとつ分かりかねるのですが、要するにアクセスカウンタとアクセスログが同期する必要が無い、すなわち「(1). ログには全アクセス分を残したいけどカウンタは回らなくていい」もしくは「(2). アクセスごとにカウンタは回したいけど全アクセスログは残さなくてもいい」、といった事でよろしいでしょうか。とりあえず、真っ当な方法でそれを実現する手段は無いと思います。

ただし、真っ当でない方法で良いのなら以下の部分を修正をすると意図通りの動きが得られるかもしれません。

(1)のパターン:

396 : if($write_flg){

396 : if(1){

(2)のパターン:

434 : if($write_flg && $res->fetchRow()){

434 : if($res->fetchRow()){

カウンタとログで異なるリロード対策時間を設定するのはさすがに大変ですが。

Takashi より:

はじめまして。
私もカウンタが表示されなくて困っていて、
このページに書いていたように改造したところ、
JavaScriptを使えばテキストカウンタが
表示されるようになりました。
ただ、複数ページをアクセス解析しているのですが、
個々のページがそれぞれカウントされず、
解析しているページの総アクセス数が表示されてしまいます。
これについて、対策などわかりましたら教えていただけないでしょうか。
宜しくお願い致します。

海水瓜 より:

申し訳ないですが、そういった使い方はしていなかったので、こちらでは分かりかねます。
お役に立てなくてすいません。

moguraに検索エンジンを追加するしかし。。

moguraの各種内部リストは、少々古くて時代に合わなくなりつつある。
特に、検索エンジン解析はSEO解析のために必須だが、せっかくの機能が
無駄にならな…

コメントを残す

メールアドレスが公開されることはありません。