※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
また、実行に際しては、サーバーでPHPが利用できる事を前提に解説しています。
■ アクセスカウンタの桁あふれ処理
前回のCGI形式のグラフィック型のアクセスカウンタでは、桁数が変わるたびHTMLを変更しないといけませんでした。
そこで、HTMLで前もって6桁表示の記述をしていても正常に動作する方法を解説してみます。
前回の方法で問題になるのは、カウンタの桁数以上の呼び出しをした場合の処理が抜けてることです。
これを「桁あふれの処理」と言います。
基本的な処理は「PHPサンプル」−「グラフィック型のアクセスカウンタ(CGI形式)」と同じです。
- 【 解 説 】
-
今回は桁あふれの処理ですから、変更箇所のみの説明をします。
まず、表示したい桁は「$ketas」にセットされています。
カウンタの桁数は「strlen()」関数を使い、次のように「$strlen0」にセットしておきます。
$strlen0 = strlen($totalc);そしてこの2つを比較し、表示したい桁数がカウンタの桁数を超えた場合は、以前解説した通り、『何も表示しない画像』を表示するようにします。
その切り分けは「if」文を使用して次のように記述できます。
if ($ketas > $strlen0){ $cnt0 = "no"; }else{ $cnt0 = substr($totalc, $ketas - 1, 1); }今回、カウンタのファイル名は「gcntcaf.cgi」としました。
このファイル名は何でもいいのですが、セキュリティの意味で拡張子は「.cgi」
にしておくことをお勧めします。このようにしておくと、訪問者がこのファイルを覗こうとした時、自動的にCGIとして実行しようとしますが、中身がCGIではないのでエラーが発生します。
したがって、覗こうとしてもエラーが発生して覗けなくなるからです。
それでは上記で解説した通り、「桁あふれの処理」を行ったわけですから、HTMLページには実際の桁数以上の記述ができます。
ですから、カウンタの桁数を最大6桁まで表示できるように「gcntca.html」という名前でサンプルを作成します。
- 【記述サンプル】
-
<HTML>
<HEAD>
<title>アクセスカウンタの桁あふれ処理</title>
</HEAD>
<BODY>
<img src="./gcntca.php?0"><img src="./gcntca.php?1"><img src="./gcntca.php?2"><img src="./gcntca.php?3"><img src="./gcntca.php?4"><img src="./gcntca.php?5"><img src="./gcntca.php?6">
</BODY>
</HTML>
では上記の方法を以前の「CGI形式のグラフィック型カウンタ」に追記してみます。
なお、今回のサンプルでは排他制御(同時書き込み時の制御)は行っていません。
Windows環境の排他制御については「PHPの予備知識」−「ファイル書き込みの排他制御」をご参照下さい。
- 【記述サンプル】
- <?php print "Content-type:text/html\n\n"; $ketas = $_SERVER["QUERY_STRING"]; $filnam = "gcntcaf.cgi"; $fp = fopen($filnam,"r"); $totalc = fgets($fp); fclose($fp); if (empty($ketas)){ $totalc = trim($totalc); $totalc++; $filnam = "gcntcaf.cgi"; $fp = fopen($filnam,"w"); fputs($fp,"$totalc"); fclose($fp); $cnt0 = "no"; }else{ $strlen0 = strlen($totalc); if ($ketas > $strlen0){ $cnt0 = "no"; }else{ $cnt0 = substr($totalc, $ketas - 1, 1); } } $filnam = "$cnt0.gif"; $fp = fopen($filnam,"r"); $imgdat = fread($fp, filesize($filnam)); fclose($fp); print $imgdat; ?>