SQLの窓 イラストAC フリー素材

2019年07月02日

家に持ち帰った mdb で簡単に php からアクセスしてテストプログラムを作る( MDBクラス付き )

もう、いまどき PHP + MDB なんてのは、仕事でしか書かないですが・・・

こんなことする人もまれだとは思いますが、知ってると結構便利だと思いますよ。
<?php
header( "Content-Type: text/html; charset=utf-8" );
session_cache_limiter('nocache');
session_start();

require_once("db.php");

$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={Microsoft Access Driver (*.mdb, *.accdb)};";
$connect_string .= "dbq=C:\\Users\\sworc\\Downloads\\hanbaic_masters.mdb;";

$db = new MDB( $connect_string, "UTF-8" );

$query = "select * from [社員マスタ]";

$column = $db->query_ex( $query );

while ( $column ) {
	print "<pre>";
	print_r( $column );
	print "</pre>";

	$column = $db->query_ex( );
};

$db->close();

?>


db.php
<?php
// ***************************
// データベースクラス
// ***************************
class MDB {
 
	var $connect;
	var $result;
	var $encoding;
 
// ***************************
// コンストラクタ
// ***************************
	function MDB( $connect_string, $encoding="MS932", $user='', $password='' ) {

		$this->encoding = $encoding;

		$this->connect = odbc_connect($connect_string, $user, $password);
	}
 
// ***************************
// 接続解除
// ***************************
	function close( ) {
		odbc_close( $this->connect );
	}
 
// ***************************
// クエリー
// ***************************
	function query( $sql_query ) {

		if ( $this->encoding != "MS932" ) {
			$sql_query = mb_convert_encoding($sql_query,"MS932",$this->encoding);
		}

		$ret = odbc_exec( $this->connect, $sql_query );
		return $ret;
	}
 
// ***************************
// フェッチ
// ***************************
	function fetch( $result ) {

		$ret = odbc_fetch_array( $result );
		if ($ret) {
			if ( $this->encoding != "MS932" ) {
				foreach($ret as $_key => $_value) {
					$ret2[mb_convert_encoding($_key,$this->encoding,"MS932")] = mb_convert_encoding($_value,$this->encoding,"MS932");
				}
			}
			else {
				$ret2 = $ret;
			}
			$cnt = 0;
			foreach($ret as $_key => $_value) {
				if ( $this->encoding != "MS932" ) {
					$ret2[$cnt] = mb_convert_encoding($_value,$this->encoding,"MS932");
				}
				else {
					$ret2[$cnt] = $_value;
				}
				$cnt++;
			}
			return $ret2;
		}
		else {
			return false;
		}
	}
 
// ***************************
// クエリーとフェッチ
// ***************************
	function query_ex( $sql_query='' ) {
 
		if ( $sql_query != '' ) {
			$this->result = $this->query( $sql_query );
			if ( !$this->result ) {
				return false;
			}
			return $this->fetch( $this->result );
		}
		else {
			return $this->fetch( $this->result );
		}
 
	}
 
// ***************************
// 実行
// ***************************
	function Execute( $sql_exec ) {
		if ( $this->encoding != "MS932" ) {
			$sql_exec = mb_convert_encoding($sql_exec,"MS932",$this->encoding);
		}

		$ret = odbc_exec( $this->connect, $sql_exec );
		return $ret;
	}
 
 
}
?>


▼ 出力結果の例
Array
(
    [社員コード] => 0001
    [氏名] => 浦岡 友也
    [フリガナ] => ウラオカ トモヤ
    [所属] => 0003
    [性別] => 0
    [作成日] => 2005-09-12 00:00:00
    [更新日] => 2005-11-28 00:00:00
    [給与] => 270000
    [手当] => 9000
    [管理者] => 
    [生年月日] => 2000-01-01 00:00:00
    [社員区分] => 0
    [年代] => A
    [0] => 0001
    [1] => 浦岡 友也
    [2] => ウラオカ トモヤ
    [3] => 0003
    [4] => 0
    [5] => 2005-09-12 00:00:00
    [6] => 2005-11-28 00:00:00
    [7] => 270000
    [8] => 9000
    [9] => 
    [10] => 2000-01-01 00:00:00
    [11] => 0
    [12] => A
)
Array
(
    [社員コード] => 0002
    [氏名] => 山村 洋代
    [フリガナ] => ヤマムラ ヒロヨ
    [所属] => 0003
    [性別] => 1
    [作成日] => 2005-06-17 00:00:00
    [更新日] => 2005-09-18 00:00:00
    [給与] => 300000
    [手当] => 
    [管理者] => 
    [生年月日] => 2000-01-02 00:00:00
    [社員区分] => 0
    [年代] => A
    [0] => 0002
    [1] => 山村 洋代
    [2] => ヤマムラ ヒロヨ
    [3] => 0003
    [4] => 1
    [5] => 2005-06-17 00:00:00
    [6] => 2005-09-18 00:00:00
    [7] => 300000
    [8] => 
    [9] => 
    [10] => 2000-01-02 00:00:00
    [11] => 0
    [12] => A
)
昔仕事場の古い SQLServer がぶっ壊れた時、新しい OS やら新しい SQLServer やらで結局 PHP からアクセスする DB のドライバは ODBC で総とっかえしました。これが一番簡単で安全だという結果になっています





posted by at 2019-07-02 23:57 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2015年11月30日

mysqli で使用していた PHP のアプリを mdb で使用する為の簡易クラス

完全ではありませんが、一通りのテストは完了しています。まだまだバージョンアップすべき部分もありますが、とりあえず学校が後二日で冬休みになるので、学生が家で手軽に勉強できるように作成しました。

ODBC + MDB なので、ソースコードを SHIFT_JIS にするとここで行っているキャラクタセットの変換は必要無くなるのですが、いろいろと今時は全て UTF-8N で揃えたほうが学生の為に良いので、内部で変換しています。
$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={Microsoft Access Driver (*.mdb)};";
$connect_string .= "dbq={$rpath}hanbaic.mdb;charSet=MS932;";
$connect = new odbc_mdb($connect_string);

class odbc_result {

	var $connect;
	var $result;
	var $num_rows;

	function odbc_result( $connect, $result ) {
		$this->connect = $connect;
		$this->result = $result;
		$this->num_rows = 0;
	}

// ***************************
// フェッチ
// ***************************
	function fetch_array( $dummy ) {

		$row = odbc_fetch_array( $this->result );
		if ( $row === false ) {
			return false;
		}

		$new_row = array();
		foreach( $row as $k => $v ) {
			$new_row[$this->connect->utf8($k)] = $this->connect->utf8($v);
		}
	
		return $new_row;
	}

	function fetch_all( $dummy ) {

		$all_row = array();

		while ($row = odbc_fetch_array( $this->result )) {
			$new_row = array();
			foreach( $row as $k => $v ) {
				$new_row[$this->connect->utf8($k)] = $this->connect->utf8($v);
			}
			$all_row[] = (object)$new_row;
		}

		return $all_row;
	}

}

class odbc_mdb {
 
	var $connect;
	var $result;
 
	function odbc_mdb( $connect_string ) {
		$this->connect = odbc_connect( $connect_string, "", "" );
	}
 
// ***************************
// キャラクタ変換
// ***************************
function utf8($str) {

	return mb_convert_encoding($str,"utf-8","MS932");
}
function sjis($str) {

	return mb_convert_encoding($str,"MS932", "utf-8");
}

// ***************************
// 接続解除
// ***************************
	function close( ) {
		odbc_close( $this->connect );
	}
 
// ***************************
// クエリー
// ***************************
	function query( $sql_query ) {

		$this->result = odbc_exec( $this->connect, $this->sjis($sql_query) );
		return new odbc_result( $this, $this->result );
	}

// ***************************
// 実行
// ***************************
	function exec( $sql_exec ) {
		$ret = odbc_exec( $this->connect, $this->sjis($sql_exec) );
		return $ret;
	}
 
 
}


関連する記事

実運用では無く、学習用の WWWサーバーとしてはこれ以外に無い『AN HTTP Server』ですが、古いソフトなので使い方にコツがあります



タグ:PHP DB MDB ODBC microsoft
posted by at 2015-11-30 22:35 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2014年07月18日

【PHP】WEB上にあるライブラリを使って簡単にMySQLにアクセス

キャラクタセットの設定について

クライアントが、EUC-JP の場合は、mysql_set_charset("eucjpms", $SQL->Connect) を実行し、クライアントが SHIFT_JIS の場合は、mysql_set_charset("cp932", $SQL->Connect) を実行します
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

require_once( "http://homepage2.nifty.com/lightbox/gen/db.php");
$conf_db_type = 1;
$SQL = new DB( "サーバー","DB","ユーザー","パスワード" );
$SQL->Debug = true;
mysql_set_charset("utf8", $SQL->Connect);

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

print "<pre>";
while( $Column ) {

	print "<HR>";
	print_r($Column);

	$Column = $SQL->QueryEx( );

}
print "</pre>";

$SQL->Close();
?>



allow_url_include が Off になっている場合
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

function inc( $path ) {

	$inc = @file( $path );
	array_shift($inc);
	array_pop($inc);
	$GLOBALS['inc_eval_txt'] = implode( "", $inc );
	eval($GLOBALS['inc_eval_txt']);
}
inc( "http://homepage2.nifty.com/lightbox/gen/db.php");
$conf_db_type = 1;
$SQL = new DB( "サーバー","DB","ユーザー","パスワード" );
$SQL->Debug = true;

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

print "<pre>";
while( $Column ) {

	print "<HR>";
	print_r($Column);

	$Column = $SQL->QueryEx( );

}
print "</pre>";

$SQL->Close();
?>

※ utf-8n で記述 / DBも utf-8

▼ オンライン簡易DBクラス
http://homepage2.nifty.com/lightbox/gen/db.php



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

2014年05月03日

PHP + Oracle : ディレクトリオブジェクトのメンテナンス ( 作成後エクスポート )





Oracle は、ファイルシステムにアクセスする為に、ディレクトリオブジェクトを必要とします。PL/SQL から CSV を出力したり、バックアップツールでダンプしたりする時に、普通に必要になるのですが、結構扱いが面倒です。

そこでその処理をツールとしてまとめたものです(SQLを実行するだけですが)。

作成後、テストしたエクスポートのコマンドライン

expdp lightbox/パスワード@//localhost/xe DIRECTORY=ORADIR DUMPFILE=lightbox.dmp SCHEMAS=lightbox

▼ export.log の内容
;;; 
Export: Release 11.2.0.2.0 - Production on 土 5月 3 00:24:09 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
;;; 
接続先: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
"LIGHTBOX"."SYS_EXPORT_SCHEMA_01"を起動しています: lightbox/********@//localhost/xe DIRECTORY=ORADIR DUMPFILE=lightbox.dmp SCHEMAS=lightbox 
BLOCKSメソッドを使用して見積り中です...
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積り合計: 1.187 MB
オブジェクト型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/VIEW/VIEWの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
. . "LIGHTBOX"."郵便番号マスタ"                        328.8 KB    3715行がエクスポートされました
. . "LIGHTBOX"."取引データ"                          137.0 KB    2463行がエクスポートされました
. . "LIGHTBOX"."コントロールマスタ"                      7.210 KB       1行がエクスポートされました
. . "LIGHTBOX"."コード名称マスタ"                       8.242 KB      19行がエクスポートされました
. . "LIGHTBOX"."メッセージマスタ"                       5.976 KB      13行がエクスポートされました
. . "LIGHTBOX"."商品マスタ"                          18.30 KB     101行がエクスポートされました
. . "LIGHTBOX"."商品分類マスタ"                        7.257 KB      29行がエクスポートされました
. . "LIGHTBOX"."商品集計"                           10.22 KB      98行がエクスポートされました
. . "LIGHTBOX"."得意先マスタ"                         23.54 KB      50行がエクスポートされました
. . "LIGHTBOX"."得意先集計"                          8.117 KB      49行がエクスポートされました
. . "LIGHTBOX"."社員マスタ"                          13.03 KB      50行がエクスポートされました
. . "LIGHTBOX"."入金予定データ"                            0 KB       0行がエクスポートされました
. . "LIGHTBOX"."社員変更履歴"                             0 KB       0行がエクスポートされました
マスター表"LIGHTBOX"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
LIGHTBOX.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
  C:\USER\LIGHTBOX\ORADIR\LIGHTBOX.DMP
ジョブ"LIGHTBOX"."SYS_EXPORT_SCHEMA_01"が00:24:46で正常に完了しました



関連する記事


posted by at 2014-05-03 00:38 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2013年11月27日

PHP+MySQLの考えられる最もシンプルなソースコード

MySQL 関数は、この拡張モジュールは PHP 5.5.0 で非推奨になっていますが、一般のレンタルサーバーで浸透するのはまだ先の話だと思います。( さくらインターネットの最新バージョンは、5.4.17 )

mysql_fetch_array は、連想配列、添字配列、両方として結果の行を取得します。

@mysql_connect の @(エラー制御演算子) は、付けないと接続エラーの時に PHP がワーニングを出力します。
exit は、言語構造なので exit; exit(); exit(0); 等、いずれでも動作します。
( die は、exit と同等です )

MySQL関数
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// DB選択
mysql_select_db( $dbname, $connect );

// クエリ
$result = mysql_query("select * from 社員マスタ", $connect);
if ( !$result ) {
	die('Invalid query: ' . mysql_error());
}

// 列数
$field_count = mysql_num_fields( $result );
$count = 0;
print "<table>\n";
while ($row = mysql_fetch_array($result)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</TR>\n";
	$count++;
}
print "</table>";

// メモリを開放ですが、通常は必要ありません
mysql_free_result($result);

// 接続解除
mysql_close($connect);
?>


mysqli クラス と mysqli_result クラス
<?php
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続
$connect = @ new mysqli($server, $user, $password, $dbname);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}

// クエリ
$result = $connect->query("select * from 社員マスタ"); 
if ( !$result ) {
	// 開放
	$result->close();
	die('Invalid query: ' . mysql_error());
}

// 列数
$field_count = $connect->field_count;
$count = 0;
print "<table>\n";
while ($row = $result->fetch_array(MYSQLI_BOTH)) {
	print "<tr>\n";
	print "\t<td>" . ($count + 1) . "</td>\n";
	for( $i = 0; $i < $field_count; $i++ ) {
		print "\t<td>{$row[$i]}</td>\n";
	}
	print "</TR>\n";
	$count++;
}
print "</table>";

// 開放
$result->close();

// 接続解除
$connect->close();
?>

関連資料

mysqli クラス
mysqli_result クラス

SQLServerPostgreSQL

関連記事

管理者として実行を強制し、ANHTTPD を実行し、MySQLサービスを起動し、エクスプローラで ANHTTPD のディレクトリを開け、ブラウザで、ANHTTPD の仮想ディレクトリを開くスクリプト


posted by at 2013-11-27 11:07 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2012年06月12日

Microsoft Drivers 3.0 for PHP for SQL Server が実運用では役に立たない件について

いくらか紹介されてはいますが、確かに繋がることは繋がりますし、SQLServer のストアードプロシージャが必要な場合は意味があるかも解りませんが、実運用では悲惨なものでした。

悲惨な内容の列挙

1) Text 型で見事に関係の無い別メモリから余計にデータを取って来る(どうしようもないバグ)
2) UTF-8 で変換するのに、列名がSHIFT_JISのままやってくる。しかもデータは SHIFT_JIS を扱えない
3) なにかのタイミングでデータ取得に失敗する

もう、1) で既にアウトですが。

正しい対処方法

PHP の ODBC 接続をふつうに使う。mssql_query が odbc_exec になって odbc_fetch_array が数字インデックスの内容を取って来ない事を除けば、DSN 作ってオプション指定できるし、動的接続文字もありだし、ドライバも自由に選べるし、SHIFT_JIS でそのまま取得できるので言う事無しの結果でした。

※ 接続環境としては、TCP/IP のポートを固定にするのがミソです。


関連する記事

ピンポイントですが、SQLServer 2008 は SQLServer 7.0 のデータをロード出来ないのです



posted by at 2012-06-12 09:09 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2009年10月19日

PHP : SQLExpress 2005 接続と通常処理


PHP : SQLExpress 2005 接続と通常処理 

VBS : SQLExpress(SQLServer) 2005 接続と通常処理 の続編で PHP バージョンです。PHP は、PDO と COM を使っています。PDO は結構良くできていますが、SQLServer への対応としては、ODBC を推奨していますから、SQLServer 依存の処理などをどうしても使いたい場合は COM の出番になると思います。

COM では、純正接続と、新旧の ODBC ドライバでテストしました。




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

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

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

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

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


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

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

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

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

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