久々に更新。
ブログやってたのを忘れるくらい久々に更新w

忙しすぎて手が腱鞘炎になっちゃうし、まだまだ忙しいのは終わらんね;

ある案件でハマりにハマったので書いとく。
日本語の文献も少ないし、誰かのためになれば・・・

Linux+PHP+Access


PHPでAccessファイルを読まなきゃならんことになった。
そいつをMySQLにデータ吐き出しして利用する。

思いつくいたのは、ODBCでAccessファイルに接続すると言うもの。

まず、MdbTools を インストールする。
https://github.com/brianb/mdbtools

まぁこれはすんなり行きました。
odbc.ini
odbcinst.ini
など色々いじって。

次にPHPのPDOを使って接続する。

何とかDBには接続できた。

SQLを投げる・・・

・・・・

・・・・



何度やってもダメ、どう設定を変えてもダメ。

PHPをオプションを変えて何度もコンパイルしなおしたがダメ。

試しに id, name カラムが 3行程度のサンプルテーブルを作成
table1
idname
1yamada
2suzuki

「SELECT * from table1」を投げて帰ってきたのが以下の内容
array(
  [0]=array(
    [id] = 1,
    [name] =
  ),
  [0]=array(
    [id] = 2,
    [name] =
  )
);

ん?文字列がダメっぽい。

mb_convert系を試すも全滅

で、いろいろ調べると、マルチバイトが怪しい。

たまたま見つけた記事で、

MDBTools のコマンドで mdb-export なるものを発見!

はい。ここで、今までの全部忘れてください。

PDO?odbc_connect?そんなの必要ありません!

mdbtools さえあれば!

これでmdb(accdb)をCSV形式で吐き出せるとな!!!

試しにtable1を吐き出す。

# mdb-export test.mdb table1
id,name
1,"yamada",
2,"suzuki",
...

おお!!!

こいつを > output.csv に吐けばCSVが完成!!
なんて素晴らしい!!

あと、テーブル名一覧を吐き出す関数 mdb-tables も便利。

以下のコマンドで、
#mdb-tables test.mdb
table1 table2 ...

とスペース区切りでmdbに内包されているテーブル名が取れる。

PHPで
$tables = exec("mdb-tables file.mdb"); //table一覧取得
これをexplodeして配列化して、
foreachでループしてやりゃ後は好きにできるじゃん!
foreach($tables as $tbl){
  $csv = array();
  exec("mdb-export file.mdb $tbl", $csv);
}

*.accdb でも行けます。