PHP 実践 カウンター
なんかあると必ず出てくるカウンタプログラム! 基礎中の基礎ですが、何事も簡単な事から!まずはいじってみましょう。 ここでのカウンタ仕様ですが、単純にカウントするだけです。 一週間毎や一ヶ月毎の集計とか採りはじめるといくらでも大きくなっちゃいますからね。 ここは簡単なとこからって・・・
カウンタに必要な機能は何でしょうか?
データを指定のファイルから読み出し、
データを出力、
データを加算して、
データを指定のファイルに書き出し、
というところですね。 つまりキモはファイルへの入出力です。 以下はソースです。
後は数値を ++ によってインクリメント(加算)して再度ファイルに書き戻しています。 ただ、アクセス件数を表示するだけであればこれで十分かと思います。
ですが週、月等のカウントを取りたい等という場合は? 一つの方法としてはデータ項目を増やしてしまうというのがあります。 週用、月用といった具合にです。 又、ログ形式にしてしまうというのも手段の一つでしょう。 アクセス毎に行(又は項目)を追加していきます。 アクセス(統計)はその行全てを計算すれば済む事です。
カウンタであるなら実際には前者をお勧めします。 ログ形式でとにかくデータを集めていった場合、区切りなどをいれないとカウント行数が膨大になった場合パフォーマンスが悪くなり、カウンタとしての用を足さなくなる可能性があるからです。
文字はできた・・・でも文字よりはグラフィックカウンタの方がいいよ! 多くはそう思うでしょう。 ではどーすんの?って、やり方は簡単! テキストカウンタの表示部分を画像を使用するタイプに変更してやれば良いだけ! 数値を桁毎に切出して表示してやりゃいいだけです。 画像は数字毎に作成し、0から9までの10ファイルが img というフォルダの中に存在すると仮定して話を進めます。 先の
ただ単純に文字を出力していた部分を一桁づつ取り出し、それと画像ファイルをくくりつけ表示させています。 strlen()で桁数だけ取得できるのでそれをforで桁分繰り返しで画像表示を行っています。 $outstr = "$count"; としているのは整数を明示的に文字列に変換しているためです。 これをやらないと整数型変数では配列形式の[]で一文字づつアクセスできないので画像の表示ができません。 型変換は必ず行ってください。 画像表示は単純に echo でタグを書出し、 src の指定部分だけ数値から動的に指定しています。
また、先の例では桁表示は固定ではなく変動ですが、もし6桁なら6桁で固定して、左側を0でパディングを行いたいという場合は 123 -> 000123 (という具合に) 以下のように書き換えます。
カウンタに必要な機能は何でしょうか?
データを指定のファイルから読み出し、
データを出力、
データを加算して、
データを指定のファイルに書き出し、
というところですね。 つまりキモはファイルへの入出力です。 以下はソースです。
<?php
$fp = fopen("phps/data.cgi",'r');
$count = intval(fgets($fp,1024));
fclose($fp);
$count ++;
echo $count,"<br>";
$fp = fopen("phps/data.cgi",'w');
fputs($fp,"$count");
fclose($fp);
?>
fopen(filepath,[option]) 関数指定のファイルをオプション形式で開きます。
r で読込み専用、 wで書き込み可能、aで追記可能という具合です。
fgets(fileResource)にてファイルから実際に値を取得していますが、ここではintval(mix)関数を利用することで整数値に整形しています。これにより、不正な値(文字列等)が与えられてもintvalによって「0」に丸め込まれるので安心です。
こういうのをサニタイズ(消毒の意)といって、様々な場面で必要な作業となります。後は数値を ++ によってインクリメント(加算)して再度ファイルに書き戻しています。 ただ、アクセス件数を表示するだけであればこれで十分かと思います。
ですが週、月等のカウントを取りたい等という場合は? 一つの方法としてはデータ項目を増やしてしまうというのがあります。 週用、月用といった具合にです。 又、ログ形式にしてしまうというのも手段の一つでしょう。 アクセス毎に行(又は項目)を追加していきます。 アクセス(統計)はその行全てを計算すれば済む事です。
カウンタであるなら実際には前者をお勧めします。 ログ形式でとにかくデータを集めていった場合、区切りなどをいれないとカウント行数が膨大になった場合パフォーマンスが悪くなり、カウンタとしての用を足さなくなる可能性があるからです。
文字はできた・・・でも文字よりはグラフィックカウンタの方がいいよ! 多くはそう思うでしょう。 ではどーすんの?って、やり方は簡単! テキストカウンタの表示部分を画像を使用するタイプに変更してやれば良いだけ! 数値を桁毎に切出して表示してやりゃいいだけです。 画像は数字毎に作成し、0から9までの10ファイルが img というフォルダの中に存在すると仮定して話を進めます。 先の
echo $count,"<br>";というコード部分を
$outstr = "$count";
for($i =0;$i < strlen("$count");$i++){
echo "<img src='./img/".$outstr[$i].".gif'>";
}
と書き換えましょう。ただ単純に文字を出力していた部分を一桁づつ取り出し、それと画像ファイルをくくりつけ表示させています。 strlen()で桁数だけ取得できるのでそれをforで桁分繰り返しで画像表示を行っています。 $outstr = "$count"; としているのは整数を明示的に文字列に変換しているためです。 これをやらないと整数型変数では配列形式の[]で一文字づつアクセスできないので画像の表示ができません。 型変換は必ず行ってください。 画像表示は単純に echo でタグを書出し、 src の指定部分だけ数値から動的に指定しています。
また、先の例では桁表示は固定ではなく変動ですが、もし6桁なら6桁で固定して、左側を0でパディングを行いたいという場合は 123 -> 000123 (という具合に) 以下のように書き換えます。
$outstr = sprintf('%06d',$count)";
for($i =0;$i < strlen($outstr);$i++){
echo "<img src='./img/".$outstr[$i].".gif'>";
}
これは sprintf() で書式フォーマット指定で6桁0左寄せパディングで整形して文字列を取得しているからです。 それを後は先ほどと同じ工程にかけてやれば良いだけです。
2008年 10月 6日ドキュメント作成
2008年 12月 25日ドキュメント更新