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 ?>
関連する記事
|
|
【MySQLの最新記事】
- MySQL に PIPES_AS_CONCAT を設定して、CSV を出力する SQL
- MySQL : DB のデータを簡単に沢山作る方法は inner join
- MySQL で、Group by して合算された行内で最新データの明細を再び取り出す SQL
- MySQL のコマンドラインの操作
- Windows 環境の MySQL から日本語名のテーブルを コマンドプロンプトでエクスポート(mysqldump.exe)する
- MySQLの日本語オンラインマニュアル、5.6 とその中のいくつかの重要なリンク
- MySQL のコマンドプロンプトからの処理用バッチファイル
- MySQL で、主キーの作り変えのプロセス / serial では、自動的に インデックスが作成されます
- MySQL 5.6 (Generally Available (GA) Releases) インストール
- MySQL : 引数の無い LAST_INSERT_ID() と 引数のある LAST_INSERT_ID( n ) の使用方法
- MySQL における AUTO_INCREMENT 列の設定および詳細
- MySQL のプログラムからの経過時間の表現方法( CAST, STR_TO_DATE, GET_FORMAT, DATE_FORMAT, TIMEDIFF )
- MySQL で出退勤の列を datetime 型で持った場合、列を使用して DATEDIFF と TIMEDIFF で直接計算
- MySQL を UTF-8 環境で作成して、mysqldump.exe でバックアップするバッチファイルのサンプル
- MySQL 5.6 : テストデータ自動作成スクリプト
- PHP + MySQL : Windows の COM を使った ODBC 経由での接続とデータの取得(SELECT)
- VBScript + MySQL : ADO( ODBC ) による接続とデータの取得(SELECT)
- PHP + MySQL : PDO_MySQL での接続とデータの取得(SELECT)
- PHP + MySQL : MySQL 改良版拡張モジュール mysqli クラスでの接続とデータの取得(SELECT)
- PHP + MySQL : PHP 5.5.0 で非推奨の MySQL 関数での接続とデータの取得(SELECT)






