2011年01月17日


PHP : COM クラスでMDBへのアクセス( db_mdb.php として DB クラス作成 )



※ COM を使った MDB のアクセスはクラス化しています。
※ hanbaic.mdb を同梱しています。
※ 使用例です

特徴として、MDB は SHIFT_JIS で゜アクセスするので、その変換をクラス内で自動的に行っています。

EUC_JP でプログラムを書いている場合は、行データの連想配列には SHIFT_JIS と EUC_JP 両方のデータがセットされます。
db_mdb.php
<?
# **********************************************************
# MDB database class
# **********************************************************
class DB {
 
	var $connect;
	var $result;

	var $fieldCount;
	var $rowCount;

	var $error;

	var $cn;
	var $rs;
	var $connectionString;

# **********************************************************
# 
# **********************************************************
	function DB( $Server='default' ) {

		$Server = $Server == 'default' ? $GLOBALS['conf_db_host'] : $Server;

		$this->cn = new COM( "ADODB.Connection" );
		$this->cn->CursorLocation = 3;
		$this->rs = new COM( "ADODB.Recordset" );
		
		$Server = $Server == '' ? realpath( "hanbaib.mdb" ) : $Server;
		$this->connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;";
		$this->connectionString .= "Data Source=$Server;";
		try {
			$this->cn->Open( $this->connectionString );
		}
		catch (Exception $e) {
			$this->error = 
				mb_convert_encoding(
					$e->getMessage(),
					$GLOBALS['conf_client_charset'],
					$GLOBALS['conf_db_charset']
				);
			$this->connect = false;
		}

	}
 
# **********************************************************
# 
# **********************************************************
	function Close( ) {
		@$this->cn->Close();
	}
 
# **********************************************************
# 
# **********************************************************
	function Query( $SqlQuery ) {

		if ( $GLOBALS['conf_db_charset'] != '' ) {
			$SqlQuery = 
				mb_convert_encoding(
					$SqlQuery,
					$GLOBALS['conf_db_charset'],
					$GLOBALS['conf_client_charset']
				);
		}

		try {
			$this->rs->Open( $SqlQuery, $this->cn );
			$ret = !$this->rs->EOF;
		}
		catch (Exception $e) {
			$ret = false;
			$this->error = 
				mb_convert_encoding(
					$e->getMessage(),
					$GLOBALS['conf_client_charset'],
					$GLOBALS['conf_db_charset']
				);
		}

		return $ret;
	}
 
# **********************************************************
# 
# **********************************************************
	function Fetch( $result ) {

		$ret = array();
		for( $i = 0; $i < $this->rs->Fields->count; $i++ ) {
			$ret[$i] = $this->rs->Fields[$i]->value;
			$ret[$this->rs->Fields[$i]->name] = $this->rs->Fields[$i]->value;
		}

		if ( $GLOBALS['conf_db_charset'] != '' ) {

			if ( $ret ) {
				$ret2 = array();
				foreach( $ret as $Key => $Value ) {
					$ret2[$Key] = 
						mb_convert_encoding(
							$Value,
							$GLOBALS['conf_client_charset'],
							$GLOBALS['conf_db_charset']
						);
					$Key2 = 
						mb_convert_encoding(
							$Key,
							$GLOBALS['conf_client_charset'],
							$GLOBALS['conf_db_charset']
						);
					$ret2[$Key2] = 
						mb_convert_encoding(
							$Value,
							$GLOBALS['conf_client_charset'],
							$GLOBALS['conf_db_charset']
						);
				}
			}

		}
		else {
			$ret2 = $ret;
		}
		return $ret2;
	}
 
# **********************************************************
# 
# **********************************************************
	function FieldName( $idx ) {

		$ret = $this->rs->Fields[$idx]->name;

		if ( $GLOBALS['conf_db_charset'] != '' ) {
			$ret = 
				mb_convert_encoding(
					$ret,
					$GLOBALS['conf_client_charset'],
					$GLOBALS['conf_db_charset']
				);
		}

		return $ret;
	}

# **********************************************************
# 
# **********************************************************
	function QueryEx( $SqlQuery='' ) {
 
		if ( $SqlQuery != '' ) {

			$this->result = $this->Query( $SqlQuery );
			if ( !$this->result ) {
				return FALSE;
			}

			$this->fieldCount = $this->rs->Fields->count;
			$this->rowCount = $this->rs->RecordCount;

		}
		else {

			$this->rs->MoveNext();
			if ( $this->rs->EOF ) {
				return FALSE;
			}

		}

		return $this->Fetch ( $this->result );

	}
 
# **********************************************************
# 
# **********************************************************
	function Execute( $SqlExec ) {

		if ( $GLOBALS['conf_db_charset'] != '' ) {
			$SqlExec = 
				mb_convert_encoding(
					$SqlExec,
					$GLOBALS['conf_db_charset'],
					$GLOBALS['conf_client_charset']
				);
		}

		$ret = TRUE;
		try {
			$this->cn->Execute( $SqlExec );
		}
		catch (Exception $e) {
			$ret = false;
			$this->error = 
				mb_convert_encoding(
					$e->getMessage(),
					$GLOBALS['conf_client_charset'],
					$GLOBALS['conf_db_charset']
				);
		}

		return $ret;
	}
 
}
?>




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

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

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

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

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


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

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

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

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

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