サーバーの都合で設置できていないが。
ということで、ここですこし中身をさらしてみる。
全体の流れとして、こんな感じになっている。
データベースから、値を読み込む。
↓
今日、一度目の訪問かチェック。一度目なら、カウントアップ
↓
XMLで出力。
そして、登録制にしていて、いくつかのカウンタを作ることができる仕様。
ところどころに出てくるIDは、ユーザーID的なもの。
まずは最後のXML出力で、XMLSerializer使ったあたり。XML出力は、betaだけどこれが一番楽。
$options = array(
'indent' => "\t", //インデントに使う文字
'encoding' => 'utf-8', //エンコーディング
'rootName' => 'counter', //ルートの要素名
'rootAttributes' => array( //ルートの属性
'id' => $this->id
),
'addDecl' => true, //<?xml version="1.0"?>タグを付けるか
'returnResult' => true //serializeメソッド実行時にXMLを返すか
);
//str_pad(文字列, 文字数, 文字, オプション);
//指定された文字数になるまで、文字列に文字を追加する。
//STR_PAD_LEFTは、左側を文字で埋める、という意味。
$output = array(
'count' => str_pad($this->count, $this->digit, '0', STR_PAD_LEFT),
'today' => str_pad($this->today, $this->digit, '0', STR_PAD_LEFT),
'yesterday' => str_pad($this->yesterday, $this->digit, '0', STR_PAD_LEFT)
);
$serializer = new XML_Serializer($options); //オプションを指定して、XML_Serializeを作成
return $serializer->serialize($output); //配列をXMLで出力
こんな感じに実装している。
$this->countと$this->todayと$this->yesterdayは、名前のとおりのカウント数が入っている。
はずであったが、todayとyesterdayはまだ未実装。
$this->idは、受け取ったIDを出力しているだけ。
つぎに、「今日一度目の訪問」あたり、PEAR/Dataで翌日0時のUNIX時を取得する。
$d = new Date();
$d->hour = 0;
$d->minute = 0;
$d->second = 0;
$d->partsecond = 0.0;
return $d->getNextDay()->getTime();
うん。そのままだね。
時間、分、秒、を0にして、翌日を取得している。
最後に、カウントアップSQL。
UPDATE counter SET count = count + 1 WHERE MD5(id) = ?
MySQL前提で考えているのだが、こんな感じ。
SQLでカウントアップもしてしまおうという魂胆。
オーバーフローとか考えるのが面度かった。
最近、ねたはあるのだが、書く時間と気力がない・・・。