SQL Server接続設定 - PHP実行環境改変メモ(5)
引き続き、自宅のPCのPHP環境の改変。
- PHP実行環境構築メモ - HHeLiBeXの日記 正道編
- PHP実行環境改変メモ - HHeLiBeXの日記 正道編
- MySQL接続設定 - PHP実行環境改変メモ(2) - HHeLiBeXの日記 正道編
- DB2接続設定 - PHP実行環境改変メモ(3) - HHeLiBeXの日記 正道編
- Oracle 10g接続設定 - PHP実行環境改変メモ(4) - HHeLiBeXの日記 正道編
いい加減、しつこいという気もするが、気にせずに(謎)。
ためしにSQL Serverに接続してみる
迷走編
(注)PHP 5.3の場合は順番に実行すると迷走します(謎)。
まずはいつものように、"php.ini"を開いて、次のような行を探し、コメントをはずす。
;extension=php_mssql.dll
SQL Serverの場合は、さらにDLL("ntwdblib.dll")が必要らしい。
- ntwdblib.dllを置いたらphpが動いたぞい - ごっ主人ブログ
- http://amon.dip.jp/index.php?PHP%20%2B%20Windows%A4%C7Microsoft%20SQL%20Server%A4%CB%C0%DC%C2%B3
どちらも、次のサイトからダウンロードせい、と書いてある。
なので、ここからダウンロードして、"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 以降使うことができません。
さらに続きがある。
そんなわけで、まずは"ntwdblib.dll"を削除し、"php.ini"の設定を元に戻して、仕切りなおし。
MS SQL 用のもうひとつのドライバである SqlSrv が、Microsoft から ≫ http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx で公開されています。 ドキュメントは ≫ http://msdn.microsoft.com/en-us/library/cc296221.aspx にあります。
本番
上記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"表の列名一覧が出力されるはず。