数学、電気の勉強始めました!プログラムにも挑戦しています!|ω・)ノ

ねごとめも背景

# ねごとめも

# カウンター

# プロフィール

negotoy

Author:negotoy
電気の勉強始めました!
テキストエディタを使ってプログラミングに挑戦中。
fc2 ブログに公開しているテンプレート等は、自由にカスタマイズして、ご活用ください。
プログラム実行の前に必ずコードの確認をお願いします。

# 最新記事

# カレンダー

03 | 2013/04 | 05
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 - - - -

# スポンサードリンク

{ <pre></pre> タグ版のテキストエディタ作成しました }

前回作成したPHP 検索キーワド取得(1)では google Analytics と同じ検索キーワード結果を
得る事が出来ていなかった。
なので、現在までに確認できた範囲で訂正。
アクセスログを調べてみると google の検索サイトからのアクセス時のキーワード取得に問題がある事が判明。
google 検索からのアクセスの場合、ホスト名の後に # で区切って値を保持している場合があった。
http://www.google.co.jp で検索をかけた場合、ホスト名の後に # 区切りで値を格納?
http://www.google.com の場合は、 ? 区切りで値を格納?
調べた範囲では上記の結果。
リファラーが有効で検索サイトからのアクセスの場合、
ホスト名の後に ? で区切って search や hash の値を保持してると思い込んでいた。

訂正したのは javascript と PHP。。。
PHP を設置してるサーバーのログを見てたらキーワード取得に失敗したケースには
ページの内容をすべて読み込む前にページを離脱してるログが残っていた。
なので、 window.onload で処理していた箇所を body 内に javascript を設置して
検索キーワードを表示する iframe を document.write で出力するようにした。
これで、処理順が上がって?検索キーワード ( referrer ) の取りこぼしが少なくなるはず!?
PHP は # 区切りのリファラー処理の変更と
検索キーワードを格納するログファイルにサイズ制限をかけた。
今までは、ログをすべて格納。
それを、 PHP の filesize 関数を使用してファイルサイズを取得。
ファイルサイズが指定したサイズを超えた場合は古い検索キーワードを削除。
ログを書き込むとき、一旦、配列に検索キーワードを格納してるから、
ログ数指定でもよかったけど、 filesize 関数を使ったことがなかったので使用。

■ init.js


addEvent(window,"load",function()
{
var url=window.location.href;
	url=url.split("?");
		url.shift();
	var search=url.join("?");
		loadFile(function(str){},"getWords.php",setPostData(["search",search]));
		setTimeout(function(){ loadFile(writeWords,"keywords.txt",""); },500);
		setInterval(function(){ loadFile(writeWords,"keywords.txt",""); },10000);
});

■ getWords.php


<?php
	function getKeywords($href)
	{
		$result="";
		$engine="";
		$url=parse_url($href);
		if(count($url)>3)
		{
			$result=isset($url["fragment"])? $url["fragment"] : $result=isset($url["query"])? $url["query"] : "";
			switch($url["host"])
			{
				case "www.google.co.jp" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
							
						}
						$engine="google";
				break;

				case "www.google.com" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
							
						}
						$engine="google";
				break;
				
				case "search.yahoo.co.jp" :
						$flg=preg_match("/p=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
						}
						$engine="yahoo";
				break;
				
				case "www.bing.com" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
						}
						$engine="bing";
				break;
				
				default :
						$result="";
			}
		}
		return array("word"=>$result,"engine"=>$engine);
	}

	function addData($words,$engine)
	{
		$fp=fopen("keywords.txt","r+");
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				$keyArray=array();
				while(!feof($fp))
				{
					array_push($keyArray,trim(fgets($fp)));
				}
				if(filesize("keywords.txt")>1000)//ファイルサイズ取得 ( filesize 関数 )
				{
					array_pop($keyArray);//古い検索キーワード削除
				}
				rewind($fp);
				ftruncate($fp,0);
				//$words=str_replace(array("<",">"),array("&lt;","&gt"),trim($words));
				$now=date('Y 年 m 月 d 日  H:i:s');
				$words=htmlspecialchars(trim($words),ENT_QUOTES);
				array_unshift($keyArray,$now."  [ ".$words." ] [ ".$engine." ]");
				fwrite($fp,implode("\n",$keyArray));
				flock($fp,LOCK_UN);
			}
		}
		fclose($fp);
	}
	$search=@$_POST["search"];
	$keywords=getKeywords($search);
	$key=$keywords["word"];
	if($keywords["word"]!="")
	{
		if(strpos($keywords["word"],"sa=t&")===0)
		{
			$keywords["word"]="not provided";
		}
		addData($keywords["word"],$keywords["engine"]);
	}
?>

検索キーワード抽出 (2) [ filesize 関数 ファイルサイズ取得 ]

ブラウザのリファラー設定が有効で検索サイトからアクセスが有った場合、
PHP でリファラー値から検索キーワードを抽出後、ブログへ出力するテスト。
chrome の google 検索も SLL 化されてるみたいだし、 chrome 使いじゃない人も
ブラウザ設定で SLL 検索を使用してる人も多いはず。
なのになじぇっ!

■ Javascript , PHP プログラム設置までの流れ

fc2 ブログへ javascript ファイルを設置、 freeweb へPHP ファイルの設置。
まず、最初に試したのは、fc2 ブログから javascript を使用して、freeweb に設置してある PHP を呼び出し、
リファラーを処理、 freeweb に設置してある検索ログファイルへ値を書き込み、出力された値を javascript を利用して
ブログに出力する流れ。
これでうまくいくと思ってたけどエラー。
XMLHttpRequest の status が 0 の値を返してくる。
テストした範囲では status 0 の症状を改善する事が出来なかった。
セキュリティ上の問題なのかな?よくわからない。

次に試したのはブログに HTML の iframe タグを使用、 PHP 設置サイトにある HTML ファイルを呼び出し、
そのファイルから、 Javascript を使用して PHP ファイルを呼び出し処理する流れ。
PHP 設置サイトにある HTML へブログで取得したリファラーの値を渡すために、
javascript を使用して iframe の src 属性の値に ( ? の後 )リファラー値を足してテスト。
iframe で読み込んでいる HTML ファイルの javascript で parent.document.getElementById("keywordFrame")
リファラーの値を取得後、処理する流れ。
ローカルサバーでは問題なく動作。
レンタルサーバーでプログラムを走らせると parent.document.getElementById("keywordFrame") の値が取得出来ずエラー。
ドメインが違う ファイルからは値の参照ができない仕様?
テストした範囲ではこの症状を改善することが出来なかった。
セキュリティ上の問題??これもよくわからない。

色々試して、ドメインが違う iframe の src の属性値は window.location.href で取得出来た。

iframe 内へ読み込んだファイルのドメインが違う場合にリファラーの値を渡すには、
iframe の src 属性へ javascript を使用して "?" の後にリファラーを足す。
iframe 内ファイルの window.location.href に値が格納されてる。

ねごとめもブログへリファラー設定有効で検索サイト ( google , yahoo , bing ) からアクセスが有った場合、
PHP MEMO に設置してある PHP でリファラーから検索キーワードを抽出後、ブログ内へその結果を出力。
まだ google Analytics と結果が一致してない。ヽ(・ω・)/ズコー

■ getWords.php


<?php

	function getKeywords($href)
	{
		$result="";
		$engine="";
		$url=parse_url($href);
		if(count($url)>3)
		{
			$result=isset($url["fragment"])? $url["fragment"] : $result=isset($url["query"])? $url["query"] : "";
			switch($url["host"])
			{
				case "www.google.co.jp" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
							
						}
						$engine="google";
				break;

				case "www.google.com" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
							
						}
						$engine="google";
				break;
				
				case "search.yahoo.co.jp" :
						$flg=preg_match("/p=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
						}
						$engine="yahoo";
				break;
				
				case "www.bing.com" :
						$flg=preg_match("/q=([^&]+)/",$result,$match);
						if($flg&&count($match)==2)
						{
							$result=(urldecode($match[1]));
						}
						$engine="bing";
				break;
				
				default :
						$result="";
			}
		}
		return array("word"=>$result,"engine"=>$engine);
	}

	function addData($words,$engine)
	{
		$fp=fopen("keywords.txt","r+");
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				$keyArray=array();
				while(!feof($fp))
				{
					array_push($keyArray,trim(fgets($fp)));
				}
				rewind($fp);
				ftruncate($fp,0);
				//$words=str_replace(array("<",">"),array("&lt;","&gt"),trim($words));
				$now=date('Y 年 m 月 d 日  H:i:s');
				$words=htmlspecialchars(trim($words),ENT_QUOTES);
				array_unshift($keyArray,$now."  [ ".$words." ] [ ".$engine." ]");
				fwrite($fp,implode("\n",$keyArray));
				flock($fp,LOCK_UN);
			}
		}
		fclose($fp);
	}
	$keywords=getKeywords($_POST["host"]."?".$_POST["search"]);
	if($keywords["word"]!="")
	{
		if(strpos($keywords["word"],"sa=t&")===0)
		{
			$keywords["word"]="not provided";
		}
		addData($keywords["word"],$keywords["engine"]);
	}
?>

google , yahoo , bing 検索キーワード抽出 (1)

前回作成したカウンターは javascript を使用して cookie を書き込み、その有効期限を利用。
今回は PHP を使用して cookie を設定。有効期限とリファラーを利用。
ページの移動歴と google , yahoo , bing の検索キーワードをログに保存するテスト。

PHP で cookie の有効期限を翌日の 0 時に指定するのに利用した関数は、 mktime 関数。
mktime 関数は 1970 年 1 月 1 日 00:00:00 から指定された時刻までの通算秒を表す長整数らしい。
色々試して cookie を 0 時に設定出来たのは下記のコード。
第五引数へ date("j") + 1 を指定すると有効期限を翌日に設定することが出来た。
cookie の値にリファラーを格納、その値を利用して同じページでの二重カウント防止。
cookie 又は referer が 許可しない に設定されているとページが更新される度にカウント。
リファラーは $_SERVER に格納されてる。


$referer=$_SERVER["HTTP_REFERER"];
setcookie("referer",urlencode($referer),mktime(0,0,0,date("n"),date("j")+1,date("Y")));

カウントから複数の IP アドレスを除外するため、 in_array 関数を使用。
配列の中に指定した値が存在しない場合、 false を返す。
IP.dat に管理人、クローラー等の IP アドレスを入力してカウントアップ防止。
一行毎に IP アドレスを入力。

■ IP.dat [ 2 つの IP アドレスを除外する場合 ]


XXX.000.000.000
XXX.000.000.001

fopen 関数を "r+" でファイルを読み込み、上書きする場合、
rewind 関数でファイルポインタを 0 , ftruncate 関数で
ファイルサイズを 0 に設定しないと、出力データが壊れる結果になった。

google , yahoo , bing の検索キーワードの取得方法は、
■ 「すべての漢字を取り出す正規表現」をPHPで試す
■ モバイル検索サイトのリファラーから検索キーワードを抽出する正規表現
を参考にしました。
リファラーを parse_url 関数で配列に格納、 $array["query"] 又は、 $array["fragment"] の値から
PHP の正規表現を利用して検索キーワードを取得。
キーワード取得には preg_match 関数を使用。
他にもマルチバイト文字列を扱うことが出来る preg_match 関数なども利用できそうです。
 ブログでは ifreme を使用して PHP を読み込んでいるので機能していません。
  動作確認はローカルサーバーのみです。

IP アドレス、ホストを保存( 一日 )。
リファラーが有効な場合、サイト内のページ移動歴を保存( 一日 )。
リファラーが有効な場合、検索キーワードを保存( テスト中 )。
同一 IP アドレスからのページ閲覧回数を保存( 一日 )。
日付が変わって最初のアクセスが発生した時、前日のアクセス歴を任意の場所に保存( 一日 )。
拡張子 .csv で出力

IP ファイル、 log ファイルなどは安全な場所に設置!\(・ω・\)

■ log.csv [ 初期値 ]


,0
,0
,0

■ counter.php


<?php
	$is_cookie=false;
	$referer="";
	$keywords="";
	if(isset($_SERVER["HTTP_REFERER"]))
	{
		$referer=$_SERVER["HTTP_REFERER"];
		$url=parse_url($referer);
		
		if(count($url)>3)
		{
			$keywords=isset($url["fragment"])? $url["fragment"] : $keywords=isset($url["query"])? $url["query"] : "";
			switch($url["host"])
			{
				case "www.google.co.jp" :
						$flg=preg_match("/q=([^&]+)/",$keywords,$match);
						if($flg&&count($match)==2)
						{
							$keywords=(urldecode($match[1]));
						}
				break;
				
				case "search.yahoo.co.jp" :
						$flg=preg_match("/p=([^&]+)/",$keywords,$match);
						if($flg&&count($match)==2)
						{
							$keywords=(urldecode($match[1]));
						}
				break;
				
				case "www.bing.com" :
						$flg=preg_match("/q=([^&]+)/",$keywords,$match);
						if($flg&&count($match)==2)
						{
							$keywords=(urldecode($match[1]));
						}
				break;
				
				default :
						$keywords="";
			}
		}
	}
	if($keywords!="") { $keywords="[".$keywords." ]"; }
	if(isset($_COOKIE["referer"]))
	{
		$is_cookie=true;
		if($referer!=urldecode($_COOKIE["referer"]))
		{
			$is_cookie=false;
		}
	}
	setcookie("referer",urlencode($referer),mktime(0,0,0,date("n"),date("j")+1,date("Y")));
	
	/*
	**csv ファイルが壊れるので半角カンマを全角へ変換
	**履歴の文字数が多くなるのでドメイン削除
	*/
	$referer=str_replace(array(",","http://negotoy.blog.fc2.com/"),array(",",""),$referer);
?>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>PHP TEST</title>
		<style type="text/css">
			*{
				font-size:100%;
				font-family:"メイリオ";
				margin:0px;
				padding:0px;
			}
			body{
				padding:5px;
			}
			img{
				padding-left:1px;
			}
			div{
				text-align:right;
			}
			#counter_box{
				font-size:12px;
				font-family:"Consolas";
				line-height:2.5em;
			}
		</style>
	</head>
	<body>
		<div>
<?php
	function getExceptIP($fileName)
	{
		$fp=fopen($fileName,"r");
		$IPArray=array();
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				while(!feof($fp))
				{
					array_push($IPArray,trim(fgets($fp)));
				}
				flock($fp,LOCK_UN);
			}
		}
		fclose($fp);
		return $IPArray;
	}

	$exceptIP=getExceptIP("IP.dat");//カウントしない IP アドレス
	$count_file="access_log.csv";//今日の履歴
	$accessIP=$_SERVER["REMOTE_ADDR"];
	$path="../counter_01/";//カウンター画像の場所
	$today=0;
	$yesterday=0;
	$total=0;
	$date=date("j");
	$lastModified=date("j",filemtime($count_file));
	if($date!=$lastModified)
	{
		$contents=file_get_contents($count_file);
		file_put_contents("log.csv",$contents);//前日の履歴( 有効期限:翌日の最初のアクセスまで )
	}
	$todaySize=3;
	$yesterdaySize=3;
	$totalSize=10;
	$contents="";
	$fp=fopen($count_file,"r+");
	if($fp)
	{
		if(flock($fp,LOCK_EX))
		{
			$n=0;
			$IPArray=array();
			$visited=false;
			while(!feof($fp))
			{
				$line=fgets($fp);
				switch($n)
				{
					case 0 ://今日の訪問数
							$line=explode(",",trim($line));
							$today=$line[1];
					break;
					
					case 1 ://昨日の訪問数
							$line=explode(",",trim($line));
							$yesterday=$line[1];
					break;
					
					case 2 ://トータルアクセス数
							$line=explode(",",trim($line));
							$total=$line[1];
					break;
					
					case 3 ://IP アドレス,HOST 名,ページ履歴,アクセス回数
					
					break;
					
					default ://IP アドレス
							list($IP,$host,$ref,$view)=explode(",",trim($line));
							$log=trim($line);
							if($IP==$accessIP)
							{
								$ref.=" → ".$referer.$keywords;
								$view=intval($view)+1;
								//$view++;
								$visited=true;
								$log=trim($IP).",".trim($host).",".$ref.",".$view;
							}
							array_push($IPArray,$log);
				}
				$n++;
			}
			if(!in_array($accessIP,$exceptIP))
			{
				/*
				**$host=$_SERVER["REMOTE_HOST"];//空の値
				**注意:  Web サーバーがこの値を生成できるように設定されている必要があります。
				**例えば Apache の場合 HostnameLookups On が httpd.conf に設定されていなければこの値は生成されません。
				**PHP マニュアルより
				*/
				$host=gethostbyaddr($_SERVER["REMOTE_ADDR"]);
				if($date!=$lastModified)
				{
					$yesterday=$today;
					$today=1;
					$total++;
					$IPArray=array($accessIP.",".$host.",".$referer.$keywords.",1");
				}
				else
				{
					if(!$is_cookie)
					{
						$today++;
						$total++;
						if(!$visited||count($IPArray)==0)
						{
							array_push($IPArray,$accessIP.",".$host.",".$referer.$keywords.",1");
						}
					}
				}
				array_unshift($IPArray,"IP アドレス,HOST 名,ページ履歴,アクセス回数");
				array_unshift($IPArray,"トータルアクセス数,".$total);
				array_unshift($IPArray,"昨日の訪問数,".$yesterday);
				array_unshift($IPArray,"今日の訪問数,".$today);
				$contents=trim(implode("\n",$IPArray));
				//fseek($fp,0);
				rewind($fp);
				ftruncate($fp,0);
				fwrite($fp,$contents);
			}
			flock($fp,LOCK_UN);
		}
	}
	fclose($fp);
	include("../counter_02/getImgTag.php");
	$result="<span id=\"counter_box\">";
	$result.="today:".getImageTag($todaySize,$today,$path);
	$result.="  yesterday:".getImageTag($yesterdaySize,$yesterday,$path);
	$result.="  total:".getImageTag($totalSize,$total,$path);
	$result.="&nbsp;</span>";
	echo($result);
?>
		</div>
	</body>
</html>

■ getImageTag.php


<?php
	function getImageTag($length,$count,$imgPath)
	{
		$format='%0'.$length.'d';
		$count=sprintf($format,$count);
		$len=strlen($count);
		$tag="";
		for($i=0;$i<$len;$i++)
		{
			$num=substr($count,$i,1);
			$tag.="<img src=\"".$imgPath."num/".(String)$num.".gif\" width=\"5\" height=\"9\">";
		}
		return $tag;
	}
?>

前回作成したアクセスカウンター
javascript で cookie を読み書き、 ajax を利用して
PHP プログラムへデータを送信、受信したデータを javascript で書き出すように変更。

テストサイト → PHP アクセスカウンター(2)

■参考にさせて頂いたサイト
  ●クッキーの使用方法
  ●クッキーの読み書き
  ●.htaccess実践活用術

今回作成したカウンターは、 javascript を利用して cookie の有効期限を
翌日の 0 時に設定、 cookie を保持してない場合はカウントアップ。
cookie が有効な場合、その日の二重カウントを防止。
又、管理人の IP アドレスが記入されたファイルをブラウザ経由でのアクセスを一切拒否する
参考にして DocumentRoot の上位に位置するフォルダに設置、
アクセスした IP アドレスが管理人の場合はカウントアップしないようにした。

javascript を使用して cookie の有効期限を翌日の 0 時に設定する場合、

var today=new Date();
var date=today.getDate();
today.setDate(today.getDate()+1);
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
today.setMilliseconds(0);
document.cookie="date="+encodeURIComponent(date)+";path="+location.pathname+";expires="+today.toGMTString();
と、すると cookie の有効期限が翌日の 0 時に設定。
日付をまたいでアクセスがあった場合、カウントがアップ。

PHP で IP アドレスを取得する場合
$accessIP=$_SERVER["REMOTE_ADDR"];
上記で変数 $accessIP に IP アドレスが格納される。

今回は IP アドレスが記入されたファイルを読み込む場合に
fopen() 関数を使用、ファイルにロックをかけて値を読み込んでいる。
PHP ファイル読み込みで検索してみると file_get_contents() 関数も利用出来そうな気が。。。
むむむっ! 違いが分からない。(-_-;)

■ counter.php


<?php
	function is_num($str){ if (preg_match("/^[0-9]+$/",$str)){ return true; }else{ return false; } }
	function is_myIP()
	{
		$flg=false;
		$fp=fopen("../myAddress.dat","r");
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				$ip=trim(fgets($fp));
				flock($fp,LOCK_UN);
				if($ip==$_SERVER["REMOTE_ADDR"]){ $flg=true; }
			}
		}
		fclose($fp);
		return $flg;
	}
	$count_file=@$_POST["file"];
	$path=@$_POST["ImgPath"];
	$up=@$_POST["count"];
	$length=10;
	$fp=fopen($count_file,"r+");
	$count=0;
	if($fp)
	{
		if(flock($fp,LOCK_EX))
		{
			$count=fgets($fp);
			if(is_num($count))
			{
				if(!is_myIP()&&$up=="true")
				{
					$count++;
				}
			}
			else
			{
				$count=1;
			}
			rewind($fp);
			fwrite($fp,$count);
			flock($fp,LOCK_UN);
		}
	}
	fclose($fp);
	include("getImgTag.php");
	$result=getImageTag($length,$count,$path);
	echo("アクセス数:".$result);
?>

■ getImgTag.php


<?php
	function getImageTag($length,$count,$imgPath)
	{
		$format='%0'.$length.'d';
		$count=sprintf($format,$count);
		$len=strlen($count);
		$tag="";
		for($i=0;$i<$len;$i++)
		{
			$num=substr($count,$i,1);
			$tag.="<img src=\"".$imgPath."num/".(String)$num.".gif\" width=\"5\" height=\"9\">";
		}
		return $tag;
	}
?>

PHP でカウンターを作成してFC2 のブログに設置してみた。↑↑↑
FC2 では PHP を利用することができないので、
無料で利用できるレンタルサーバー freeweb
ホームページを新しく開設。
広告が少し長い気がするけど、PHP MySQL WordPress が無料で利用できるのはありがたい。
MySQL も WordPress も使ったことないんだけどね。。。
今まで PHP のテストはローカルサーバー?( xampp ) を使用。
今回はじめてレンタルサーバーで自作の PHP プログラムを実行してみたけど、
パーミッション、.htaccess の設定なども理解するまでに時間がまだまだかかりそうでう。

で、今回挑戦したのは PHP を利用したアクセスカウンター
IP チェック、クッキーも利用してないので、アクセスする度にカウントするという代物
今後、PHP で作成したプログラムは、 PHP MEMO サイトに公開してく予定?
javascript ( ajax ) を利用したカチャカチャアクセスカウンターにも挑戦してみた。
ajax ( javascript ) は■Ajax : 勉強用サンプル&解説を参考にさせて頂きました。

■ counter.php ( iframe 用 )


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>PHP TEST</title>
		<style type="text/css">
			*{
				font-size:100%;
				font-family:"メイリオ";
				margin:0px;
				padding:0px;
			}
			img{
				padding-left:1px;
			}
			#counter{
				text-align:right;
				line-height:2.5em;
			}
			
		</style>
	</head>
	<body>
	<?php
		function is_num($str){ if (preg_match("/^[0-9]+$/",$str)){ return true; }else{ return false; } }
		$count_file="count.txt";
		$length=10;
		$count=0;
		$fp=fopen($count_file,"r+");
		if($fp)
		{
			if(flock($fp,LOCK_EX))
			{
				$count=fgets($fp);
				$flg=is_num($count);
				if($flg){ $count++; }else{ $count=1; }
				rewind($fp);
				fwrite($fp,$count);
				flock($fp,LOCK_UN);
			}
		}
		fclose($fp);
		$len=strlen($count);
		$result="<div id=\"counter\"><a href=\"http://negoto.hotcom-web.com/\" target=\"_top\">カチャカチャカウンター</a>( iframe 使用 )   アクセス数:";
		for($i=$length-1;$i>=0;$i--)
		{
			$num=($i>=$len)? 0 : substr($count,$len-$i-1,1);
			$result.="<img src=\"num/".(String)$num.".gif\" width=\"5\" height=\"9\">";
		}
		$result.="&nbsp;</div>";
		echo($result);
	?>
	</body>
</html>

■ counter.php ( javascript 使用 )


<?php
	function is_num($str){ if (preg_match("/^[0-9]+$/",$str)){ return true; }else{ return false; } }
	$count_file=@$_POST["file"];
	$path=@$_POST["ImgPath"];
	$length=10;
	$fp=fopen($count_file,"r+");
	$count=0;
	if($fp)
	{
		if(flock($fp,LOCK_EX))
		{
			$count=fgets($fp);
			$flg=is_num($count);
			if($flg){ $count++; }else{ $count=1; }
			rewind($fp);
			fwrite($fp,$count);
			flock($fp,LOCK_UN);
		}
	}
	fclose($fp);
	$len=strlen($count);
	$result="";
	for($i=$length-1;$i>=0;$i--)
	{
		$num=($i>=$len)? 0 : substr($count,$len-$i-1,1);
		$result.="<img src=\"".$path."num/".(String)$num.".gif\" width=\"5\" height=\"9\">";
	}
	echo($result);
?>

# スポンサードリンク