PHP5 with SQLServer2005Express
はじめに
忘れないうちに備忘録として残しておきます。
環境について
Apache2 and PHP5 on Win32のページと同じ環境ですので、同じ設定でないと、このページを参照しても動かないかもしれません。
- Microsoft Windows2000 Professional SP4(VirtualPC2004上)
- Apache2.0.55
- php-5.1.2
※ Apache2.2.4, php-5.2.4 に差し替えてあります。
Configuration
php.iniの修正
extension php_mssql.dllを必要としますので、これをロードできるように php.ini を修正します。 修正と言ってもコメントアウトを解除するだけです。
システム環境変数 Path の確認
上記の dll 以外に ntwdblib.dll も必要としますので、これもロードできるようにシステム環境変数の Path が通っているか確認します。 ちなみに C:\php-X.X.X-Win32 ディレクトリ下に php5ts.dll その他諸々のファイルと共に置いてあります。 ※システムディレクトリに dllファイルのコピーはしないのでこれをしっかり確認しておかないと Apache の起動時に dll のロードエラーが発生します。
ntwdblib.dllの補足
phpパッケージに付属する ntwdblib.dll はバージョンが古く sqlserver 接続時にコネクションエラーが発生しますので新しいモノと差し替えておく必要があります。 ファイルバージョンが 2000.2.8.0 のモノは NG。2000.80.194.0 のモノは OK。 これでだいぶ悩まされました。
ntwdblib.dllの入手について
php本家で指し示しているのは http://www.webzila.com/ なのですが、出所に一抹の不安を感じるので、microsoft本家から SQLServer2000SP4 を入手して差し替えました。 解凍したドライブ名(C:等)\SQL2KSP4\x86\system ディレクトリの中に有ります。 ちなみに、これで得られるライブラリのバージョンは 2000.80.2039.0 です。
そもそも
SQLServer2000 までは内包されていましたが SQLServer2005 Express からは除外されました。(これが廃止なのかは調べていません) その結果、露呈した問題なのですが対処方法はわかったもののそれに使用する"モノ"を第三者のサイトから取り込んでも良いのか?と疑問は残ります。 配布されているのはライブラリと言えども microsoft のプロダクトなわけですからね。 それでは microsoft本家から SQLServer2000 の評価版(こちらは 2000.80.194.0)やSP4(こちらは2000.80.2039.0)を得て抜き出して使う、ってのも配布されている主旨と使用する側の意図するところが違うから完全に"白"とは言えないですし。 まぁ、使用にあたっては個々の判断(責任)に委ねるということで。
SQLServer2000からの移行組みは
SQLServer2000 からの移行、もしくは SQLServer2000 と SQLServer2005 Express と共存な環境の場合はシステムディレクトリにライブラリが残っているはずなので何もすることはないでしょう。 むしろ php 配布物添付の ntwdblib.dll は削除の方向で。 正しく動作するライブラリが決まった場所に一つだけ存在していた方が無用のトラブルを未然に防げます。
Microsoft 謹製 PHP Driver
Webサイト徘徊していたら CTP版のニュースがありました。 で、早速お試し。 ちなみにこの driver に差し替えると ntwdblib.dll はいらなくなります。(確認済み) SQLServer2005 Express with PHP Driver
設定が終わったら
システム環境変数の変更を行った場合は OS の再起動を。 php.ini の修正だけで済む場合は WebServer の再起動を行います。
mssql_connect関数について
Windows認証での接続ができないとの誤解が生じているようなので要点をまとめておきます。 接続エラーの場合、確認作業は PHP側だけでなく DBMS の方も見ないと駄目ですよ?
Windows認証
php.iniの mssql.secure_connection 項目のコメントアウトを外し On に変更します。
既定のインスタンスの場合
- ローカル接続のみ
- mssql_connect(); (これもあり? mssql_connect('.');)
- hostnameの指定
- mssql_connect('localhost'); or mssql_connect('myhostname');
- IPAddressの指定
- mssql_connect('127.0.0.1');
名前付きインスタンスの場合
- ローカル接続のみ
- mssql_connect('.\sqlexpress');
- hostnameの指定
- mssql_connect('localhost\sqlexpress'); or mssql_connect('myhostname\sqlexpress');
- IPAddressの指定
- mssql_connect('127.0.0.1\sqlexpress');
混合認証
php.iniの mssql.secure_connection 項目をコメントアウトするか Off に変更します。

既定のインスタンスの場合
- ローカル接続のみならこういうのもありかも(未検証)
- mssql_connect('id', 'password'); or mssql_connect('.', 'id', 'password');
- hostnameの指定
- mssql_connect('localhost', 'id', 'password'); or mssql_connect('myhostname', 'id', 'password');
- IPAddressの指定
- mssql_connect('127.0.0.1', 'id', 'password');
名前付きインスタンスの場合
- インスタンス名(ローカル接続のみ)
- mssql_connect('.\sqlexpress', 'id', 'password');
- hostnameの指定
- mssql_connect('localhost\sqlexpress', 'id', 'password'); or mssql_connect('myhostname\sqlexpress', 'id', 'password');
- IPAddressの指定
- mssql_connect('127.0.0.1\sqlexpress', 'id', 'password');
PDO関数について
認証方式は
混合認証でのみ接続可能です。
以下は例
- hostname
- srv 注・既定のインスタンスで構成しているのでインスタンス名 \sqlexpressは無し
- 使用DB
- mydb
- ID
- myid
- Password
- mypassword
- PDO関数の記述
- PDO('mssql:host=srv; dbname=mydb', 'myid', 'mypassword');
接続例について
Workgroupレベル、リモート接続、動作保証一切無しという条件での接続例はこちら。
PHP5 with SQLServer2005Express remote connect WindowsAuth
PHP5 with SQLServer2005Express remote connect SQLAuth
[Index] [Top]
Written: 2006/03/22
Last modified: 2007/11/13