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()関数を用いてレコードの有無の判定を行うように変更してやる。これで、見かけ上まともに動くようにはなった。多分。
それにしても、何なんだこの妙な動きは。バグというか、環境の違いみたいなものだろうか。
コメントを残す