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

Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

PHPでSQL Serverに接続したい

環境

DB : SQL Server 2005 Express Edition
Webサーバー : CentOS

step1 Windowsからリモートで接続できるかやってみる

SQL Server Management Studioを使う

pgAdminよりもすげー高級な統合環境。でも操作がよくわからない。

マイクロソフト公式ダウンロード センターから Microsoft SQL Server Management Studio Express をダウンロードからツールをダウンロードして使う。
ネットワーク上にSQL Serverがいれば、サーバーの接続画面のサーバー名のリストボックスの"参照"をクリックしてサーバーを探し出すことができる。


このとき
SQL ServerのインストールされているサーバーでSQL Server Browser*1というサービスが起動していると勝手に接続先のインスタンス名を取得できるのだが、サービスが動いていないときは手動でインスタンス名を入力しないといけない。


基本的にはマシン名+インスタンス名になるようだ。

SQL Express Editionならインスタンス名はSQLEXPRESSになる???


SQL Server 2005でネットワーク接続を有効にするには? − @ITを見ながらポートの設定を確認しておくとハマらなくてよい。

step2 LinuxのサーバーからODBCで接続する

FreeTDSの設定を行う

インストールはyumなりで行う。

freetds.conf

[任意のサーバー名]
host = サーバーのIP
port = サーバーのポート
tds version = 9.0
charset = sjis
client charset = UTF-8
language = english

のようにFreeTDSの設定を書く。tds versionはSQL Server2005なら9でよいらしい。

unixODBCの設定を行う

インストールは先ほど同様に省略。


odbcinst.ini

[FreeTDS]
Driver          = /usr/local/lib/libtdsodbc.so
Description     = 適当な説明

FreeTDSと書いたが、そこも任意の文字列。また、Driverで指定するライブラリのパスは個々に設定することになるだろう。


odbc.ini

[データソース名]
Driver = FreeTDS(odbcinst.iniで書いたセクション名)
Description = 適当な説明
ServerName = freetds.confで書いたサーバー名
Database = DB名
isqlでテスト

odbcのユーティリティのisqlで接続をしてみる。

isql データソース名 ユーザーID パスワード

で接続ができるはず。

ここで指定したユーザーにDBにアクセスする権限がないとうまくいかないときがある。
テストをするだけならば、DBのオーナーでアクセスすれば、成功するはず。

step3 PHP側の設定

PHPの再インストール
pecl install PDO_ODBC

とコマンドを打っても、うまくできなかったのでPHPの再インストールを行った。

PHP: ODBC and DB2 (PDO) - Manualの通り

--with-pdo-odbc=unixODBC,/usr/local

というオプションをつけて、インストールをしたらPDO_ODBCが使えるようになった。


phpinfoを実行したときに
PDO driversの項目の中にodbcとあればインストール成功。

ちょっとはまった

このとき/usr/localとなっているが、環境によってはパスが違うかもしれない。何のパスを指定すれば、いいのかわからなくてはまっていたのだが、unixODBCのincludeとlibの一つ上のディレクトリを指定すればいいようだ。


また、--with-ibm-db2というオプションがあるとODBCのドライバにDB2用のものが選ばれるようで、うまくいかなかった。

PHP実行

最終的に

$dbh = new PDO ("odbc:DSN=データソース名;UID=ユーザー名;PWD=パスワード");

というようなコードが実行できるようになり、DBに接続ができた。