db.php は簡単なクラスですが、MS Access を使用する為に SHIFT_JIS でSQL を作成する必要があります。また、戻された結果も SHIFT_JIS なので UTF-8 に変換しています。利用者は、UTF-8 ベースのソースコードから SHIFT_JIS を意識せずに処理する事が可能になります。 db.php(クラス)
<?php // *************************** // データベースクラス // (このソースは UTF-8N) // // UTF-8 => SHIFT_JIS // *************************** class DB { public $connect; public $result; // *************************** // コンストラクタ // *************************** function DB( $connect ) { $this->connect = odbc_connect($connect, "", ""); } // *************************** // 接続解除 // *************************** function close( ) { odbc_close( $this->connect ); } // *************************** // 単純クエリー( 実行 ) // *************************** function query( $sql_query ) { // SHIFT_JIS に変換 $sql_query = mb_convert_encoding( $sql_query, "cp932", "utf-8" ); $ret = @odbc_exec( $this->connect, $sql_query ); return $ret; } // *************************** // フェッチ // *************************** function fetch( $result=null ) { // 引数が無い場合は前回実行された // $this->result を使用する if ( $result == null ) { $result = $this->result; } // ※ Invalid argument supplied for foreach() $error = error_reporting(E_ALL & ~E_WARNING); // SHIFT_JIS のデータ $ret1 = odbc_fetch_array( $result ); // 空の配列 $ret2 = array(); // 数字をインデックスとする配列を作成する foreach ($ret1 as $key => $value) { // UTF-8 で使えるようにする $ret2[] = mb_convert_encoding( $value, "utf-8", "cp932" ); } // 連想配列を作成する foreach ($ret1 as $key => $value) { // UTF-8 で使えるようにする $key = mb_convert_encoding( $key, "utf-8", "cp932" ); $ret2[$key] = mb_convert_encoding( $value, "utf-8", "cp932" ); } // 関数内での設定以前に戻す error_reporting($error); // 数字インデックスと文字列インデックスの連想配列 return $ret2; } // *************************** // クエリーとフェッチ // *************************** function query_ex( $sql_query='' ) { // 引数がある場合は、query and fetch if ( $sql_query != '' ) { $this->result = $this->query( $sql_query ); if ( !$this->result ) { return false; } return $this->fetch( ); } // 引数が無い場合は fetch のみ else { return $this->fetch( ); } } // *************************** // 実行 : query と同じ // *************************** function execute( $sql_exec ) { // SHIFT_JIS に変換 $sql_exec = mb_convert_encoding( $sql_exec, "cp932", "utf-8" ); $ret = odbc_exec( $this->connect, $sql_exec ); return $ret; } } ?>
以下は、accdb を使って( mdb でも可 )データを JSON として出力しています。 ms-access-json.php
<?php // *************************** // このソースは UTF-8N // *************************** header( "Content-Type: text/plain; Charset=utf-8" ); // *************************** // キャッシュを使用しない // *************************** header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" ); header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" ); header( "Pragma: no-cache" ); // *************************** // データベースアクセスクラス // *************************** require_once("db.php"); // *************************** // PHP 設定 // *************************** mb_language( "ja" ); mb_internal_encoding("UTF-8"); // *************************** // MS Acceess ファイル // *************************** $dbfile = "販売管理B.accdb"; //$dbfile = "販売管理B.mdb"; // *************************** // ファイル名を SHIFT_JIS に変換 // *************************** $dbfile = mb_convert_encoding( $dbfile, "cp932", "utf-8" ); // *************************** // 接続文字列 // ODBC ドライバ名( 32ビット ) // のある場所 ▼ // HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI // *************************** $connect_string = "Provider=MSDASQL;"; $connect_string .= "Driver={Microsoft Access Driver (*.mdb, *.accdb)};"; $dbpath = realpath($dbfile); $connect_string .= "dbq={$dbpath};"; // *************************** // クラスのインスタンス // *************************** $db = new DB( $connect_string ); if ( $db->connect === false ) { print "接続に失敗しました : " . mb_convert_encoding( odbc_errormsg(), "utf-8", "cp932" ); exit(); } // *************************** // 1) UTF-8 で SQL を作成 // *************************** $query = <<<SQL select [社員マスタ].*, [社員マスタ].[社員コード] as scode from [社員マスタ] where [社員コード] in('0001','0002','0003') SQL; // *************************** // データ全体用の配列 // *************************** $json = array(); // *************************** // クラスでクエリの実行 // ※ 初回 // *************************** $column = $db->query_ex( $query ); if ( $column === false ) { print "SQLの実行に失敗しました : " . mb_convert_encoding( odbc_errormsg( $db->connect ), "utf-8", "cp932" ); $db->close(); exit(); } // *************************** // 全ての行を取得 // *************************** while ( $column ) { // *************************** // 行単位で結果の連想配列をセット // *************************** $json['items'][] = $column; $column = $db->query_ex( ); }; // *************************** // 接続解除 // *************************** $db->close(); // *************************** // php.exe の確認 // *************************** if( PHP_INT_SIZE == 4 ) { print "PHPは 32ビットです\n"; } // *************************** // テストの為、見やすいオプション // 1) 日本語をエスケープしない // 2) 整形する // *************************** print json_encode( $json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); ?>
関連する Microsoft ドキュメント( 接続文字列 ) Microsoft OLE DB Provider for ODBC の概要 データ ソースにアクセスする( 接続文字列を作成する ) 出力結果
PHPは 32ビットです { "items": [ { "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": "0001", "社員コード": "0001", "氏名": "浦岡 友也", "フリガナ": "ウラオカ トモヤ", "所属": "0003", "性別": "0", "作成日": "2005-09-12 00:00:00", "更新日": "2005-11-28 00:00:00", "給与": "270000", "手当": "9000", "管理者": "", "scode": "0001" }, { "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": "0002", "社員コード": "0002", "氏名": "山村 洋代", "フリガナ": "ヤマムラ ヒロヨ", "所属": "0003", "性別": "1", "作成日": "2005-06-17 00:00:00", "更新日": "2005-09-18 00:00:00", "給与": "300000", "手当": "", "管理者": "", "scode": "0002" }, { "0": "0003", "1": "多岡 冬行", "2": "タオカ フユユキ", "3": "0002", "4": "0", "5": "2005-08-14 00:00:00", "6": "2005-11-14 00:00:00", "7": "250000", "8": "", "9": "", "10": "0003", "社員コード": "0003", "氏名": "多岡 冬行", "フリガナ": "タオカ フユユキ", "所属": "0002", "性別": "0", "作成日": "2005-08-14 00:00:00", "更新日": "2005-11-14 00:00:00", "給与": "250000", "手当": "", "管理者": "", "scode": "0003" } ] }
32 ビット ODBC の一覧をレジストリエディタで開く
strParam = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI" ' レジストリ書き込み用 Set WshShell = CreateObject( "WScript.Shell" ) ' WMI用 Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") ' レジストリエディタが最後に開いていたキーの登録を行います strPath = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey" if GetOSVersion() >= 6 then strRegPath = "コンピューター\" & strParam else strRegPath = "マイ コンピュータ\" & strParam end if ' 既に regedit が実行中の場合はいったん終了させます Set colProcessList = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = 'regedit.exe'") For Each objProcess in colProcessList ' 最後のウインドウの位置とサイズを保存する為の終わらせ方 WshShell.AppActivate("レジストリ エディタ") Wscript.Sleep(500) WshShell.SendKeys ("%{F4}") Wscript.Sleep(500) ' 上記終わらせ方が失敗した時の強制終了 on error resume next objProcess.Terminate() on error goto 0 Next WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ" ' レジストリエディタを起動します Call WshShell.Run( "regedit.exe" ) ' レジストリエディタが終わるまで待つ場合は以下のようにします ' Call WshShell.Run( "regedit.exe", , True ) REM ********************************************************** REM OS バージョンの取得 REM ********************************************************** Function GetOSVersion() Dim colTarget,str,aData,I,nTarget Set colTarget = objWMIService.ExecQuery( _ "select Version from Win32_OperatingSystem" _ ) For Each objRow in colTarget str = objRow.Version Next aData = Split( str, "." ) For I = 0 to Ubound( aData ) if I > 1 then Exit For end if if I > 0 then nTarget = nTarget & "." end if nTarget = nTarget & aData(I) Next GetOSVersion = CDbl( nTarget ) End Function
|
【PHP + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン
- PHP : SQLインジェクション対策付きの、MySQL のデータを JSON で返す自家製 API テスト用のテンプレート3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。
- PHP : PDO のエラー処理
- PHPのマニュアルにある、SQLインジェクション攻撃の例
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス