PHP5 with SQLServer2005Express


はじめに

忘れないうちに備忘録として残しておきます。

環境について

Apache2 and PHP5 on Win32のページと同じ環境ですので、同じ設定でないと、このページを参照しても動かないかもしれません。

それとSQLServer2005Express Editionですね。

※ 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');
hostname や IPAddress 直打ちでコネクションエラーになる場合は SQLServer の TCP/IP接続設定を 見直した方がいいです。

名前付きインスタンスの場合

ローカル接続のみ
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');
こちらも hostname や IPAdddress 直打ちでコネクションエラーになる場合は SQLServer の TCP/IP接続設定を 見直した方がいいです。

名前付きインスタンスの場合

インスタンス名(ローカル接続のみ)
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