Hatena::Groupmoti

PHP+(ODBC+Access)

PHP+(ODBC+Access)

PHP+(ODBC+Access)

目次

PHPでAccessを操作する(環境構築編)

VBメインのシステムにオマケでWEBからもアクセスできる機能をつけるときにPHPを使ってAccessをいじる方法。


環境

Apache2.0.54(WinXP)+PHP5+Access2003

準備

まずはODBCによるAccess操作を参照してファイルとしてしか存在していないhoge.mdbにPHPからアクセスできるようにデータベース名をつけます。

ここで注意するのはドライバの選択画面で一覧に「*.mdb」に対応したドライバが二つ表示されるところです。ここで下にある「Treber」を選択しないで画像のとおり「マイクロソソフトアクセスドライバー」を選択してOKしましょう。


次にPHP導入手順書 for Windows with AN HTTPDを参照して先ほど名前をつけたAccessファイルに今度はログインユーザ名とパスワードを設定します。(「3-2.システムDSNを設定する」の項)

これでODBC+Accessの設定は終わりです。

次は正しく設定されているかサンプルスクリプトを使って検証です。

動作テスト

もう一度PHP導入手順書 for Windows with AN HTTPDを参照して「4.サンプルスクリプト」にあるサンプルスクリプトを作成します。

サンプルスクリプトのままだともしAccessに接続できていなくてもエラーを出してくれないので、一部修正します。

44行目付近にある、

//データベースへの接続を開く
$conn_id = odbc_connect(_DBName,_DBUser,_DBPassword);

という部分を

if(!$conn_id = odbc_connect(_DBName,_DBUser,_DBPassword)){	
			die("接続に失敗しました。");
		}

と修正します。こうしておけばもし接続に失敗した場合「接続に失敗しました。」と表示して教えてくれます。

PHPのバージョン4以前を使っているならばこのままサンプルスクリプトを実行して表示されるフォームにクエリ発行すればデータが帰ってくるのですが、PHP4以降のバージョンを使っていると「POST」がうまく使えない様なので外部から来る変数を参照して、

PHP4.2.0以降の変更点

PHP4.2.0以降のバージョンでは、PHPの設定ファイルであるphp.iniの以下の設定の値が、これまでと違いデフォルトで「Off」になっています。

register_globals = Off

これは偏にセキュリティ強化の為の措置のようですが、このままでは以前のように「$変数名」と言う単純な形での外部データの取得が出来ません。

外部から来る変数
register_globals = On

にしましょう。*1

文字コードの設定

PHPからAccessにクエリを送って操作する上で一番重要かつ失敗しやすいのが文字コードの設定です。Accessはマイクロソフト社の製品なので内部文字コードに「Shift-JIS」を使っています。*2

php.iniをいじって根本から文字コードを設定しなくても適所

mb_convert_encoding($hoge,"EUC-JP","SJIS");

などとして変換してしまえば表示されることはされるのだけど毎回手間だしコードは汚くなるし、ただでさえ遅いPHP+Accessがさらに遅くなりそうです。

php.iniをいじって元から設定してしまえば今後楽なのでやってしまいましょう。

設定するには、PHPの文字化けについてを参照して文字コードを設定します。

今回はPHP+Accessな環境でデフォルトの文字コードは「SJIS」なので上記ページの一番下に書かれているMySQL用設定を

たとえば、MySQLを利用する場合なら「default-character-set=sjis」としたら「mbstring.internal_encoding = SJIS」とします。

PHPの文字化けについて

そのまま使えば問題ないです。

PHPでAccessを操作する(実践編)

今回はPHP+Accessでショッピングカートを作ったのでその辺を例に進める。

検索

PHPからクエリを発行してAccessの中を検索するには次のように書く。

//フォームから検索語を受け取る
$q=$_POST['q'];

//検索クエリ用に%と結合する("%"はワイルドカード
$q= "%"."$q"."%";
 
//クエリ作成
$SEARCH="SELECT com_code FROM commodity WHERE com_name LIKE '$q' ";

検索がうまくいかない場合は文字コードが誤って送信されている可能性があるので英数のみで検索してみるなどしてみる。

続く?

続くかどうかは未定。

*1:PHP+Accessで作るシステムなんか大勢が使うわけないのでセキュリティはあまり気にしない

*2:エクスポートの画面では出力するファイルの文字コードが指定できたが中に持ってるデータベースの文字コードを設定する項目は見つからなかった