2011年01月17日


PHP : ユーザクラスで MDB にアクセス

以下のクラスを使用しています

PHP : COM クラスでMDBへのアクセス( クラス化 )

<?
$conf_db_charset = "shift_jis";
$conf_client_charset = "euc-jp";

header( "Content-Type: text/html; Charset=$conf_client_charset" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
}

require_once( "db_mdb.php" );

// MDB に接続
$SQL = new DB( 'hanbaic.mdb' );
if ( $SQL->connect === false ) {
	
	$msg = "接続できませんでした<br>\n";
	$msg .= $SQL->error;
	print $msg;
}

if ( $_POST['send'] == '更新' ) {

	// 更新処理
	if ( trim($_POST['text']) != '' ) {

		if ( !$SQL->Execute( $_POST['text'] ) ) {
			$msg = "更新でエラーが発生しました<br>\n";
			$msg .= $SQL->error;
			print $msg;
		}

	}
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=<?= $conf_client_charset ?>" />
<title>MDB 更新</title>
<style type="text/css">
* {
	font-size: 12px;
}
.column {
	border: solid 1px #000000;
	padding: 4px;
}
.head_column {
	border: solid 1px #000000;
	padding: 4px;
	background-color: silver;
	font-weight: bold;
}
.err_column {
	border: solid 1px #000000;
	padding: 4px;
	color: blue;
	font-weight: bold;
}
textarea {
	width: 600px;
	height: 300px;
}
</style>

<script type="text/javascript">

// ****************************
// 更新確認
// ****************************
function checkForm() {
	if ( !confirm( "更新を行いますか?   " ) ) {
		return false;
	}
	return true;
}

</script>
</head>
<body>

<form
	name="frm"
	method="POST"
	onSubmit='return checkForm();'
>
<table border="1">
<tr>
	<td class="column">

	<textarea name="text"><?= $_POST['text']?></textarea>
	<br />
	<input
		type="submit"
		name="send"
		value="更新"
	>

	</td>
</tr>
</table>
</form>

<?

	if ( $SQL ) {

		$column = $SQL->QueryEx( "select * from 社員マスタ" );

		$str="<table border=\"1\">";
		while ( $column ) {

			$str.="<tr> \n";
			$str.="<td class=\"column\">{$column['社員コード']}</TD> \n";
			$str.="<td class=\"column\">{$column['氏名']}</TD> \n";
			$str.="</tr> \n";

			$column = $SQL->QueryEx( );
		}
		$str.="</table>";
		print $str;

		$SQL->Close();

	}

?>

</body>
</html>





タグ:PHP MDB com
posted by at 2011-01-17 18:30 | PHP+COM | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

2010年10月07日


PHP : COM 経由( ODBC ) での Oracle アクセス

<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// 接続オブジェクト
	$cn = new COM( "ADODB.Connection" );
	// クライアント側カーソル
	$cn->CursorLocation = 3;
	// レコードセットオブジェクト
	$rs = new COM( "ADODB.Recordset" );

	// 接続文字列作成
	// Microsft ドライバ
	$ConnectionString = "Provider=MSDASQL;" .
		"Driver={Microsoft ODBC for Oracle}" .
		";SERVER=vpc-019/orcl" .
		";UID=LIGHTBOX" .
		";PWD=LIGHTBOX" .
		";";

	// 純正 ドライバ
	//$ConnectionString = "Provider=MSDASQL;" .
	//	";Driver={Oracle in OraClient11g_home1}" .
	//	";DBQ=vpc-019/ORCL" . 
	//	";UID=LIGHTBOX" .
	//	";PWD=LIGHTBOX" .
	//	";";

	// 接続
	$cn->Open( $ConnectionString );

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs->Open( $query, $cn );
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->Execute( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる
	$rs->Close();

	// 接続解除
	@$cn->Close();

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



posted by at 2010-10-07 14:23 | PHP+COM | このブログの読者になる | 更新情報をチェックする

PHP : COM 経由( OO4O ) での Oracle アクセス

OpenDatabaseメソッドの3つ目の引数は、デフォルト(Visual Basicモード)のモードです。

CreateDynasetメソッドの第二引数は、データベースから取り出された文字列データから、
後続するブランクを削除しない事を意味します。
<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// Oracleオブジェクト
	$OracleOO4O = new COM( "OracleInProcServer.XOraSession" );

	// 接続文字列作成
	$db_path = realpath(mb_convert_encoding( "./販売管理C.mdb", "SHIFT_JIS", "EUC-JP" ));
	$ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;";
	$ConnectionString .= "Data Source=$db_path;";

	// 接続
	$cn = $OracleOO4O->OpenDatabase("VPC-019/ORCL", "LIGHTBOX/LIGHTBOX", 0);

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs = $cn->CreateDynaset($query,2);
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->ExecuteSQL( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる必要はありません

	// 接続解除は必要ありません

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



posted by at 2010-10-07 13:10 | PHP+COM | このブログの読者になる | 更新情報をチェックする

PHP : COM 経由の MDB に対するアクセス

<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// 接続オブジェクト
	$cn = new COM( "ADODB.Connection" );
	// クライアント側カーソル
	$cn->CursorLocation = 3;
	// レコードセットオブジェクト
	$rs = new COM( "ADODB.Recordset" );

	// 接続文字列作成
	$db_path = realpath(mb_convert_encoding( "./販売管理C.mdb", "SHIFT_JIS", "EUC-JP" ));
	$ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;";
	$ConnectionString .= "Data Source=$db_path;";

	// 接続
	$cn->Open( $ConnectionString );

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs->Open( $query, $cn );
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->Execute( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる
	$rs->Close();

	// 接続解除
	@$cn->Close();

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



posted by at 2010-10-07 12:20 | 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 %>
この記述は、以下の場所で使用します