dポイントプレゼントキャンペーン実施中!

PHPを勉強しているものですが
アクセスカウンターをネットで調べ自分なりに書いたのですが
日にちが変わるとトータル、今日、昨日が全く動かなくなります。
どこをどうすればいいのか教えていただけないでしょうか?
お願いします。
$txt='counter.txt';
$fp=fopen($txt,'r+');
if($fp!==false){
if(flock($fp,LOCK_EX)){
$counter=fgets($fp);//トータル 今日 昨日 日付
$count=explode(' ',$counter);
if(date('j') != $count[3]){
$count[3]=date('j');
$count[2]=$count[1];
$count[1]=0;
}
$count[0]++;
$count[1]++;
$counter=implode(' ',$count);
rewind($fp);
fputs($fp,$counter);
flock($fp,LOCK_UN);}
}
fclose($fp);

ちなみにバグはトータル→今日→昨日→日付の順です。
500 1 1 262625 のようになっていました。
よろしくです。

A 回答 (2件)

書き込むサイズが短くなる(前のデータの残骸が影響する)可能性があります。

fputsで書き出す前に

ftruncate($fp, 0);

としてください。

<?php
$txt = 'counter.txt';
$fp = fopen($txt, 'r+');
if($fp !== false){
if(flock($fp, LOCK_EX)) {
$counter = fgets($fp);//トータル 今日 昨日 日付
$count = explode(' ', $counter);
if(date('Ymd') != $count[3]) {
$count[3] = date('Ymd');
$count[2] = $count[1];
$count[1] = 0;
}
$count[0]++;
$count[1]++;
$counter = implode(' ', $count);
rewind($fp);
ftruncate($fp, 0);
fputs($fp, $counter);
flock($fp, LOCK_UN);}
}
fclose($fp);
    • good
    • 0
この回答へのお礼

お礼遅れました(。>A<。)すいません!
ftruncate($fp, 0);これを記述したらちやんと動いてくれました(≧∇≦)
本当にありがとうございました!(^^)

お礼日時:2013/02/27 06:14

たぶん2行目の r+ のせいだと思います


fopenの r+ オプションとはファイルを開いてポインタを最初に持ってくるという方法です
つまり
12345678
というファイルを開いて
abcd
をfputsすると
abcd5678
となってしまいます
fopenのオプションを w+ にすれば大丈夫だと思いますが、fopenやfcloseを使わないで、file_get_contentsとfile_put_contentsを使うとわかりやすいと思います
    • good
    • 0
この回答へのお礼

お返事ありがとうです!(≧∇≦)
わかりました!次から file_get_contents やfile_put_contentsを使ってみます!
一応前の方の回答で動いていくれたのですが一応w+にしときます!(≧∇≦)うりがとうございました!(^^)

お礼日時:2013/02/27 06:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!