 今回は、ちょっとフォームからはずれて、簡単なカウンターの原理をやります。
今回は、ちょっとフォームからはずれて、簡単なカウンターの原理をやります。
 左の図はよく見かけるアクセスカウンターです。
左の図はよく見かけるアクセスカウンターです。
これを簡単に実現するにはSHTMLを使います。
(SSIが使えない環境では実現できません)
ファイルの名前を*.shtmlにします。環境によっては*.htm,*.htmlでもよい場合があります。中身は普通のhtmlと同じです。ちょっと違うのは
<!--#exec cmd="xxx.cgi"-->
とするとxxx.cgiの出力結果がそのままブラウザに表示される点です。 上の図のソースは次のようになっています。
<HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>カウンター</TITLE> </HEAD> <BODY> <CENTER> <H1>猫でもわかるカウンター</H1> <HR> <!--#exec cmd="count01.cgi"--><BR> </CENTER> </BODY> </HTML>(通常cgiの実行できるディレクトリは限定されているのでcount01.cgiにはパス名がついています。)
では、プログラムを見てみましょう。実に簡単です。
// count01.cpp
#include <stdio.h>
#include <process.h>
#define FILENAME "log/count.log"
int main()
{
	FILE *fp;
	int cnt, newcnt;
	fp = fopen(FILENAME, "r");
	if (fp == NULL) {
		printf("Error!");
		exit(-1);
	}
	fscanf(fp, "%d", &cnt);
	fclose(fp);
	newcnt = cnt + 1;
	fp = fopen(FILENAME, "w");
	if (fp == NULL) {
		printf("Write Error!");
		exit(-1);
	}
	fprintf(fp, "%d", newcnt);
	fclose(fp);
	printf("No.%06d",cnt);
	return 0;
}
ファイルから数値を読み出してprintf関数で出力します。そして、ファイルには読み出した数値を1増やして上書きします。 これで、呼び出されるたびに1ずつ増えた数値が表示されます。 このソース・ファイルをコンパイルしてできあがったものを*.cgiにリネームして cgiのディレクトリに転送します。
なおこの例では、最初にlogというディレクトリにcount.logというファイルを作っておき0または、適当な数字を書き込んでおかなくてはエラーとなります。また、 count.logのファイルパーミッションを書き込み可能にしておく必要があります。
さて、これでカウンターそのものは表示されるようになりましたが、いつアクセスされたかの記録が欲しいですね。これも簡単です。
// count02.c
#include <stdio.h>
#include <process.h>
#include <time.h>
#define FILENAME "log/count.log"
#define LOGNAME "log/ac.log" //アクセスログ
int main()
{
	FILE *fp;
	int cnt, newcnt, i;
	time_t present_tm;
	struct tm *my_time;
	char *now_time;
	time(&present_tm);
	my_time = localtime(&present_tm);
	now_time = asctime(my_time);
	fp = fopen(FILENAME, "r");
	if (fp == NULL) {
		printf("Error!");
		exit(-1);
	}
	fscanf(fp, "%d", &cnt);
	fclose(fp);
	newcnt = cnt + 1;
	fp = fopen(FILENAME, "w");
	if (fp == NULL) {
		printf("Error!");
		exit(-1);
	}
	fprintf(fp, "%d", newcnt);
	fclose(fp);
	fp = fopen(LOGNAME, "a");
	if (fp == NULL) {
		printf("error!");
		exit(-1);
	}
	i = (int)strlen(now_time);
	//asctimeでは、最後に改行とヌル文字が付加されるので改行を取り除く
	now_time[i - 1] = '\0';
	
	fprintf(fp, "%d,%s,\n", cnt, now_time);
	fclose(fp);
	printf("No.%06d",cnt);
	return 0;
}
ac.logファイルには次のような感じで記録されます。
0,Sat Sep 21 01:39:21 2002, 1,Sat Sep 21 01:39:23 2002, 2,Sat Sep 21 01:39:24 2002, 3,Sat Sep 21 01:39:25 2002, 4,Sat Sep 21 01:39:26 2002, 5,Sat Sep 21 01:39:27 2002,さて、いつアクセスされたかがわかったら次にもっといろいろなことを知りたくなりますね。それには環境変数を取得します。調べてみてください。
Update Sep/21/2002 By Y.Kumei