HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

DB2接続設定 - PHP実行環境改変メモ(3)

引き続き、自宅のPCのPHP環境の改変。

ためしにDB2に接続してみる

以前に、PHPWindows版バイナリがあるということをブログで見た記憶がよみがえってきたので、まずはその記事を探し出すことから始めた。

前者の記事からいろいろと辿って試してみたのだが、うまくいかず‥Apache httpdのエラーログに次のようなエラーが出ていた。

PHP Warning:  PHP Startup: ibm_db2: Unable to initialize module\nModule compiled with module API=20060613\nPHP    compiled with module API=20090626\nThese options need to match\n in Unknown on line 0
<br />
<b>Warning</b>:  PHP Startup: ibm_db2: Unable to initialize module
Module compiled with module API=20060613
PHP    compiled with module API=20090626
These options need to match
 in <b>Unknown</b> on line <b>0</b><br />

後で気づいたのだが、どうもこのモジュールはPHP 5.2以前の何か(何)用のものなのではないかと。自分の環境はPHP 5.3。

どうせ使っているDB2のバージョンはv9.7がメインだし、ということで後者の記事を参考に試してみることにした。

私のPCには、DB2 Express-C v9.1/9.5/9.7が同居しているのだが、それぞれの"dsdriver\php"ディレクトリを見ると次のようなファイルがある。

v9.7にはREADMEが入っていたので、まずそっちを読んでみると、最新版を入手することを推奨している。自分の環境がPHP 5.3であることもあるので、記載内容にしたがって、次のサイトからPHP 5.3用のDB2 PHPドライバを入手。

自分の環境のPHPがVC6版なので、"php_ibm_db2-1.9.0-5.3-ts-vc6-x86.zip"をダウンロード。解凍して得られる"php_ibm_db2.dll"をextension_dirに設定した"C:\PHP\php-5.3.3-Win32-VC6-x86\ext"に配置する。
続いて、"php.ini"の適当なところに次の行を追加する。

extension=php_ibm_db2.dll

その後、Apache httpdを再起動する。phpinfo()を見てみてibm_db2の項があればOK。
確認のため、次のようなPHPスクリプトを実行してみる。

<pre><?php
//    $db2 = db2_connect(
//        'DRIVER={IBM DB2 ODBC DRIVER};'
//        . 'DATABASE=sandbox;'
//        . 'HOSTNAME=localhost;'
//        . 'PORT=50002;'
//        . 'PROTOCOL=TCPIP;'
//        . 'UID=db2admin;'
//        . 'PWD=admin;',
//        '',
//        '');
    $db2 = db2_connect(
        'sandbox',
        'db2admin',
        'admin');

    $schema = 'SYSIBM';
    $table = 'TABLES';
    $query =
        "select table_schema, table_name, column_name"
        . " from SYSIBM.columns"
        . " where table_schema = ?"
        . "     and table_name = ?"
        . " order by ordinal_position";
    $stmt = db2_prepare($db2, $query);
    $success = db2_execute($stmt, array($schema, $table));
    while (($row = db2_fetch_assoc($stmt))) {
        print_r($row);
    }
    db2_close($db2);
?></pre>

正常に実行されれば、SYSIBM.TABLES表の列名が出力されるはず。
ちなみに、db2_connect()を呼び出している部分だが、自分の環境では"sandbox"というデータベースをカタログしているので上記のままで動作する。一方、データベースをカタログしていない場合は、上記のコメントアウトしている部分のように書くとよいらしい。

しかし、PHPからデータベースにアクセスするためのAPIDBMSによってずいぶん違うのだな、と思ったらしい。