質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

2回答

1347閲覧

PDOでMS Accessのデータを取得した際に発生する問題点について

FKM

総合スコア3608

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

1グッド

0クリップ

投稿2018/08/23 06:28

編集2018/08/23 07:01

XAMPP上のPHPプログラムデータで、PDOを使いAccess2003のMDBファイルを読み取り、出力するシステムが、一業務において必要となっています。

PDOを用いたAccessファイルへの接続はうまく行っているのですが、2点どうしても解決できない問題点が発生しています。
※もし、試される場合、php.iniのextension=pdo_odbcのコメントを外して有効にしてください。

PHP

1 $dbh = new PDO("odbc:DRIVER={Microsoft Access Driver (*.mdb)}; Dbq=$dbName; Uid=''; Pwd='';");

1. 日本語カラムからデータを取得できない。

PHP上にSQLを記述する際に、

PHP

1 $sql = "select * from \"{$table}\" where '"\日本語カラム名\"' = $code;"

取得したいデータで、日本語のカラムが入るテーブルがあるため、現状カラム名を半角英数字に書き換えないとデータがうまく取得できない状態となっています(カラムを英数字に書き換えるとうまく取得できます)。

2. 環境依存文字(ローマ数字)を出力した際に、どうしても文字化けが起きる。

MDBファイル上のデータに、ローマ数字(Ⅰ~Ⅴ)を含んだ値があり、MDBファイル上では文字化けしていないのですが、PDOを使って出力した際に、"?"などに文字化けして正しく表示されません。文字参照を使ってpreg_replaceで置き換えると、ブラウザ上は正しく表示されるのですが、ファイルをダウンロードさせてtxtファイルにて出力した際に、文字参照のまま表示されてしまいます。

やったこと
・元のエンコードを調べるために、var_dump(mb_detect_encoding($hoge))とした → falseとなり、認識できなかった。
・mb_convert_encoding($hoge,"SJIS","auto")から変換先、変換後をあらゆる通りで試した。

以上、2つの点について解決方法をご存知の方、よろしくお願い致します。

m.ts10806👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PDOでAccessにアクセスするというようなトリッキーなことはしたことがないのですが、

考えられる原因としては、

mb_detect_encoding() は厳密には「文字エンコーディングを検出する」ものではないということ。

http://php.net/manual/ja/function.mb-detect-encoding.php

より正確に検出するためには、第2引数、第3引数を設定することです。

php

1var_dump(mb_detect_encoding($hoge))

これでは第1引数しか指定していないので、精度は高くないです。

mb_convert_encoding($hoge,"SJIS","auto")

Windowsで扱われる文字コードは SJIS ではなく、SJIS-win です。

投稿2018/08/23 06:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2018/08/23 06:59

ありがとうございます。mb_convert_encodingでもいろいろ試してはいます。変換元がautoだとwarningが出たのでcp932にして、変換先をUTF-8にした場合はⅠが竇?となってしまいます。
退会済みユーザー

退会済みユーザー

2018/08/23 07:01

私の手元にWindowsがないので、申し訳ないですが、これ以上はお手伝い不可能です。
FKM

2018/08/23 07:46

centOS7で構築が一番の理想なんですが、どうもそれだとうまくAccessにPDO接続できずに断念して、xampp環境にしているという理由もあります。海外のサイトも隈なく見てたら、物理的に不可能と書かれたサイトもあって…(ubuntuだとできるかもしれないと書いていたページもありましたが)。 もし、Linux環境でAccessにPDO接続できましたら、またご連絡いただけると幸いです。
退会済みユーザー

退会済みユーザー

2018/08/23 08:03

WHERE句なしの SELECT * FROM table でSQLを発行し、レコードセットをvar_dump() すれば、カラム名や値がどんなエンコードになっているかを確認することができませんかね?
FKM

2018/08/23 09:17 編集

ASCIIと出たので、mb_convert_encodingの変換元をそれにしてみたら、今度はツ?となりました。 そこで、 http://jac484.jugem.jp/?eid=22 にあるように、mb_convert_encoding($hoge,"UTF-8",mb_detect_encoding($hoge,"ASCII",true)))としてみたのですが、うまく変換されません。
退会済みユーザー

退会済みユーザー

2018/08/23 09:21

ASCIIっていうのは、英数字のことですよ。つまり、マルチバイト文字として認識できていないということ。 まず前提として、mb_detect_encoding() の動作を信用してはいけません。 mb_detect_encoding は第3引数に設定された、あくまでエンコード種類のリスト順に動くだけで、それらしい結果を返すだけです。
FKM

2018/08/23 09:29

マルチバイト文字として認識できていないってことですね。それでmb_convert_encodingで何を代入しても正しい動作がしないのだと合点がいきます。だとすると、次の手段として文字参照だと正しくブラウザ上で表示されるわけですが、これをSQLファイル出力した際も、ローマ数字のまま認識させて出力する方法がないか探ってみます。
退会済みユーザー

退会済みユーザー

2018/08/23 09:31 編集

ローマ数字はWindows とLinux系、Macとはコードが異なるため、個別に変換しない限りコンバートできないはず…。
FKM

2018/08/23 09:43 編集

そうなんですね、だとするとあとは手入力で修正した方が早そうですね。こっちの質問は一旦解決したのでクローズし、日を改めてもう一つの質問に絞ることにします。数々の助言、ありがとうございました。
guest

0

あれから、Linux(Centos7)でも接続することができました。まだ、日本語カラムのデータ取得方法は模索中ですが、一歩前進です。

その成果をQiita様に記載しておきます。
https://qiita.com/BRSF/items/6b097569079f2e3cc601

投稿2018/11/07 06:12

編集2018/11/07 10:19
FKM

総合スコア3608

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問