MySQL の Windows における ODBC ドライバは、既存の SHIFT_JIS ベースの古いアプリケーシヨンの為に、charset 変更できるのがデータ部分だけとなっていました。こちらから送る SQL 内のキャラクタセットは 日本語環境においては SHIFT_JIS でやりとりするような前提で設計されているようです。 ですから、PHP で利用するとなると、ソースコードを SHIFT_JIS として、ドライバの charset を cp932 にすると全て日本語環境でうまくいくようになっています。もし、UTF-8 ベースで PHP のコードを書く必要がある場合は、charset を utf8 にすると、データは正しく utf8 で読み込めます。ただ、SQL を SHIFT_JIS で書く必要がありますし、列名(連想配列内)は SHIFT_JIS なので、mb_convert_encoding で変換する必要があります。 PDO_ODBC > ODBC 関数 ODBC 関数は、古くからある関数で、他の MySQL 関数に比べると実装(機能)が分散されていて、同じ処理をする場合にコード量が増えてしまいます。しかし、SQLServer に接続して処理を行う場合は信頼性が高いようです。( SQLServer 用の ODBC ドライバは選択肢としてとても有効だと思います ) ただ、MySQL をターゲットとする場合は、わさわざ ODBC を選ぶ必要はほとんどありません。 ODBC 関数
<?php header( "Content-Type: text/html; Charset=shift_jis" ); header( "pragma: no-cache" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); header( "Cache-control: no-cache" ); $server = 'localhost'; $db_name = 'lightbox'; $user = 'root'; $password = 'パスワード'; $connect_string = "Provider=MSDASQL;"; $connect_string .= "Driver={MySQL ODBC 5.3 Unicode Driver};"; $connect_string .= "Server={$server};"; $connect_string .= "DATABASE={$db_name};"; $connect_string .= "UID={$user};"; $connect_string .= "PWD={$password};"; $connect_string .= "charset=cp932;"; // このキャラクタ設定は、サーバーからのキャラクタセット // クライアントは SHIFT_JIS が前提で、インストールされた PCに依存しているようです。 // 接続 $connect = @odbc_connect($connect_string, "", ""); if ( !$connect ) { die("接続エラーです : " . odbc_errormsg() ); } // クエリ $result = @odbc_exec($connect,"select * from 社員マスタ"); if ( !$result ) { die('クエリーに誤りがあります : ' . odbc_errormsg() ); } // 列数 $field_count = odbc_num_fields( $result ); $count = 0; ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <style> * { font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif; font-size: 12px; } table { border-collapse: collapse; border-style: solid; border-color: #c0c0c0; border-width: 1px; background-color: #FFFFFF; } td { padding: 5px; border-style: solid; border-color: #c0c0c0; border-width: 1px; } </style> </head> <body> <?php print $connect_string; $log_file = "rowdata_003.log"; file_put_contents( $log_file,"" ); print "<table>\n"; while (odbc_fetch_into($result,$row)) { 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++; file_put_contents( $log_file, print_r($row,true), FILE_APPEND ); } print "</table>"; // メモリを開放ですが、通常は必要ありません odbc_free_result($result); // 接続解除 odbc_close($connect); ?> <br> 出力件数 : <?= $count ?>
PDO_ODBC
<?php header( "Content-Type: text/html; Charset=shift_jis" ); header( "pragma: no-cache" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); header( "Cache-control: no-cache" ); $conf = array( "driver" => "{MySQL ODBC 5.3 Unicode Driver}", "server" => "localhost", "db" => "lightbox", "user" => "root", "pass" => "パスワード", "charset" => "cp932" ); // ********************************************************** // 接続 // ********************************************************** try { $connect = new PDO( "odbc:Driver={$conf['driver']};Server={$conf['server']};" . "Database={$conf['db']};Uid={$conf['user']};Pwd={$conf['pass']};". "charset={$conf['charset']}"); } catch ( Exception $ex ) { die( '{"error": "接続できませんでした: ' . $ex->getMessage() . '"}' ); } // ********************************************************** // 結果セット // ********************************************************** $rs = $connect->query( "select * from 社員マスタ" ); if ( $rs === false ) { $er = $connect->errorInfo(); die('{ "error" : "' . $er[2] . '" }'); } // フィールド数 $field_count = $rs->columnCount(); $count = 0; ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <style> * { font-family: "メイリオ", Meiryo, "MS Pゴシック", sans-serif; font-size: 12px; } table { border-collapse: collapse; border-style: solid; border-color: #c0c0c0; border-width: 1px; background-color: #FFFFFF; } td { padding: 5px; border-style: solid; border-color: #c0c0c0; border-width: 1px; } </style> </head> <body> <?php print $connect_string; $log_file = "rowdata_004.log"; file_put_contents( $log_file,"" ); print "<table>\n"; while ($row = $rs->fetch(PDO::FETCH_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++; file_put_contents( $log_file, print_r($row,true), FILE_APPEND ); } print "</table>"; $rs->closeCursor(); ?> <br> 出力件数 : <?= $count ?>
関連する記事