読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

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

SQL Server接続設定 - PHP実行環境改変メモ(5)

PHP SQL Server

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

いい加減、しつこいという気もするが、気にせずに(謎)。

ためしにSQL Serverに接続してみる

迷走編

(注)PHP 5.3の場合は順番に実行すると迷走します(謎)。
まずはいつものように、"php.ini"を開いて、次のような行を探し、コメントをはずす。

;extension=php_mssql.dll

SQL Serverの場合は、さらにDLL("ntwdblib.dll")が必要らしい。

どちらも、次のサイトからダウンロードせい、と書いてある。

なので、ここからダウンロードして、"C:\PHP\php-5.3.3-Win32-VC6-x86"の直下に配置。
そして、Apache httpdを再起動。
‥さて、Apache httpdのエラーログを見てみると、次のようなエラーが。

PHP Startup: Unable to load dynamic library 'C:/PHP/php-5.3.3-Win32-VC6-x86/ext\php_mssql.dll' - 指定されたモジュールが見つかりません。

というわけで、覗いてみると、確かに"php_mssql.dll"がない。
そこで、確認してみる‥


Win32 プラットフォームでの要件


この拡張モジュールは、Windows 版では PHP 5.3 以降使うことができません。
‥え!?
さらに続きがある。

MS SQL 用のもうひとつのドライバである SqlSrv が、Microsoft から ≫ http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx で公開されています。 ドキュメントは ≫ http://msdn.microsoft.com/en-us/library/cc296221.aspx にあります。
そんなわけで、まずは"ntwdblib.dll"を削除し、"php.ini"の設定を元に戻して、仕切りなおし。

本番

上記Microsoftサイトから、"SQLServerDriverForPHP11.EXE"をダウンロードおよび解凍し、適切なDLLファイルを選ぶ。
自分の環境はPHP 5.3(VC6版)なので、"php_sqlsrv_53_ts_vc6.dll"を使用する。
使用するDLLファイルを"C:\PHP\php-5.3.3-Win32-VC6-x86\ext"にコピーし、名前を"php_sqlsrv.dll"に変更する。
で、"php.ini"の適当な場所に次の行を追加する。

extension=php_sqlsrv.dll

そして、Apache httpdを再起動。
今度はエラーらしいエラーが出ていないので、動作確認のために、上記ドキュメント(http://msdn.microsoft.com/en-us/library/cc296221.aspx)を参照して苦労して書いた次のスクリプトを実行する。(関数名がすべて"sqlsrv_xxx"なのだが、php.netにはドキュメントがないという‥)

<pre><?php
    $sqlsrv = sqlsrv_connect(
        'localhost,54575\SQLEXPRESS',
        array('Database' => 'sandbox',
            'UID' => 'sa',
            'PWD' => 'admin'));
//    $sqlsrv = sqlsrv_connect(
//        'localhost,52673\SQLEXPRESS2008',
//        array('Database' => 'sandbox',
//            'UID' => 'sa',
//            'PWD' => 'admin!'));

    $query1 =
        'CREATE TABLE hoge('
        . 'val1 INT,'
        . 'val2 NUMERIC(8,3),'
        . 'val3 VARCHAR(15),'
        . 'val4 TIMESTAMP)';
    $result1 = sqlsrv_query($sqlsrv, $query1);
    sqlsrv_free_stmt($result1);

//    $query2 =
//        "SELECT @@VERSION AS version";
    $query2 =
        "SELECT TABLE_NAME, COLUMN_NAME"
        ."    FROM INFORMATION_SCHEMA.COLUMNS"
        ."    WHERE TABLE_NAME = 'hoge'";
//    $query2 =
//        "SELECT T.NAME AS TABLE_NAME, C.NAME AS COLUMN_NAME"
//        ."    FROM SYS.TABLES AS T"
//        ."    INNER JOIN SYS.COLUMNS AS C"
//        ."    ON T.OBJECT_ID = C.OBJECT_ID"
//        ."    WHERE T.NAME = 'hoge'";
    $result2 = sqlsrv_query($sqlsrv, $query2);
    while (($row = sqlsrv_fetch_array($result2, SQLSRV_FETCH_ASSOC))) {
        print_r($row);
    }
    sqlsrv_free_stmt($result2);

    $query3 =
        'DROP TABLE hoge';
    $result3 = sqlsrv_query($sqlsrv, $query3);
    sqlsrv_free_stmt($result3);

    sqlsrv_close($sqlsrv);
?></pre>

これが正常に実行されれば、"hoge"表の列名一覧が出力されるはず。


たかがDBMSに接続するだけのことなのに、ここまで迷走したのは5つ目のDBMSにして初めてだ‥やれやれ。