2010年01月21日


PHP+MySQL+GD+フォントでアクセスカウンタ



<img
	src="page_counter.php?id=myPage"
	style='
		border-style:solid;
		border-color:#000000;
		border-width:1px;
	' 
/>
上記のように、myPage を指定するだけで、自動的に行が作成されて加算されていきます。もしテーブルが無い場合は最初に一度だけテーブル作成が行われます ※ trust.lst に無い URL で、使用する事ができないようになっています
■ 著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私( lightbox )が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。

lightbox
同梱している 7barPBd.TTF は以下のサイトよりダウンロードして使用しています単位変換/デジタル時計フォン/Illustratorソフト/定規
<?php
header("Content-type: image/png");
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "pragma: no-cache" );
header( "Cache-control: no-cache" );

# ***************************
# DB 情報
# ***************************
$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

# **************************************
# 埋め込みを許可したページ以外はエラー
# **************************************
$trust = false;
$file = file( "trust.lst" );	// 許可対象 URL の先頭文字列リスト
for( $i = 0; $i < count( $file ); $i++ ) {

	# 改行削除
	$target = rtrim( $file[$i] );

	# 空行は無視
	if ( $target == "" ) {
		continue;
	}

	# コメント文字
	if ( substr( $target, 0, 1 ) == ";" ) {
		continue;
	}

	$len = strlen( $target );
	$ref = substr( $_SERVER['HTTP_REFERER'], 0, $len );
	if ( $target == $ref ) {
		$trust = true;
		break;
	}
}

# ***************************
# 使用不可
# ***************************
if ( !$trust ) {
	// 使用権限なし
	$img_text = "8888888888";
}
else {
	# ***************************
	# id が指定されていない場合
	# ***************************
	if ( $_GET['id'] == '' ) {
		$_GET['id'] = "default";
	}

	// 接続
	$connect = @mysql_connect( $server, $user, $password );
	# ***************************
	# 処理
	# ***************************
	if ( $connect ) {
		mysql_select_db( $dbname, $connect );
		$_GET['id'] = mysql_real_escape_string( $_GET['id'], $connect );


# ***************************
# SQL文ヒアドキュメント
# ***************************
$query_update = <<<QUERY_UPDATE
update page_counter
	set access_count = access_count + 1
	where page_id = '{$_GET['id']}'
QUERY_UPDATE;

$query_insert = <<<QUERY_INSERT
insert into page_counter
	values('{$_GET['id']}',0)
QUERY_INSERT;

$query_create = <<<QUERY_CREATE
create table page_counter (
	page_id VARCHAR(20)
	,access_count INT
	,primary key(page_id)
)
QUERY_CREATE;

$query_select = <<<QUERY_SELECT
select * from page_counter
	where page_id = '{$_GET['id']}'
QUERY_SELECT;

		// 更新処理( +1 )
		$result = mysql_query($query_update,$connect);
		if ( !$result ) {
			$result = mysql_query($query_create,$connect);
			// 新規行追加
			$result = mysql_query($query_insert,$connect);
			$result = mysql_query($query_update,$connect);
		}
		else {
			if ( mysql_affected_rows($connect) == 0 ) {
				$result = mysql_query($query_insert,$connect);
				$result = mysql_query($query_update,$connect);
			}
		}
		// 更新結果読み出し
		$result = mysql_query($query_select,$connect);
		$column = mysql_fetch_row($result);
	
		$img_text = sprintf( "%010d", $column[1]+0 );
	}
	else {
		// 接続エラー
		$img_text = "0000000000";
	}
}

$font_path = "./7barPBd.TTF";

# ***************************
# キャンバス作成
# ***************************
$im = imagecreate( 150, 30 );

# ***************************
# 画像の背景色
# imagecolorallocate() の最初のコールで背景色がセットされます
# ***************************
$white = imagecolorallocate( $im, 255, 255, 255 );

# ***************************
# 画像の文字色
# ***************************
$black = imagecolorallocate( $im, 0, 0, 0 );

imagettftext(
	$im,
	20,	# サイズ
	0,	# 角度
	5,	# x 座標
	25,	# y 座標
	$black,
	$font_path,
	$img_text);

# ***************************
# PNG 出力
# ***************************
imagepng($im);

# ***************************
# 終了処理
# ***************************
imagecolordeallocate( $im, $black );
imagecolordeallocate( $im, $white );
imagedestroy($im);

?>




タグ:PHP gd MySQL font
posted by at 2010-01-21 20:27 | PHP | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します