Linux上のPHPからSQLServerに接続する

sqlserver表題の作業をやったんですが、物凄く苦労しました。ググれば情報は出てくるんだけど、書かれた通りやっても上手くいかなかったり。

サーバの構成とかによってもやり方変わるしね。詳しい方にアドバイス貰いつつ何とか出来ました。

サーバ
Windows Server 2003 R2 SP2
SQLServer 2008 EXPRESS

クライアント
Red Hat Enterprise Linux 4
PHP5.2.14(PDOは使える状態)

SQLServerと外部接続するにはODBCを使います。PHPで使えるのを調べてみるとPDO_DBLIBです。ネット上ではこれをインストールするには

# pecl install pdo_dblib

と書かれてたけど、エラーで出来ず。仕方ないので自分でコンパイルする事に。

その前にFreeTDSが必要なのでそっちを入れます。これはyumでインストールできた。

# yum install freetds-devel-0.64-1.el4.rf

設定ファイルfreetds.confは以下のように書く。

# vi /usr/local/etc/freetds.conf
[global]
 port = 1433
 tds version = 8.0
 text size = 2147483647
 charset = sjis
 client charset = UTF-8

[mssql]
 host = (IPアドレス)
 port = 1433
 tds version = 8.0
 charset = sjis
 client charset = UTF-8

PDO_DBLIBをコンパイルしてみると…エラー出る。共有ライブラリを認識させないとダメらしい。

# vi /etc/ld.so.conf
/usr/local/lib
# ldconfig

今度こそ出来た。

# tar xvf PDO_DBLIB-1.0.tar
# cd PDO_DBLIB-1.0
# phpize
# ./configure
# make
# male install

pdo_dblib.soが作成されたので、それを/usr/local/php5/lib/php/extensions/5.2.14/にコピーしてからextensions.ini編集。

# vi /usr/local/php5/etc/extensions.ini
extension=pdo_dblib.so

そしてApache再起動。phpinfo()で確認するとdblib入ってました。これで完了かと思ったらまだダメで、unixODBClibiconvが必要だった。

# tar xvzf unixODBC-2.2.11.tar.gz
# cd unixODBC-2.2.11
# ./configure --enable-gui=no
# make
# make install

設定ファイルodbcinst.ini

# vi /usr/local/etc/odbcinst.ini
[FreeTDS]
Driver    = /usr/lib/libtdsodbc.so.0
Setup     = /usr/lib/libtdsS.so
CPTimeout =
CPReuse   =
FileUsage = 1

設定ファイルodbc.ini

# vi /usr/local/etc/odbc.ini
[ODBC Data Sources]
freetds = FreeTDS ODBC Driver

[freetds]
Driver = FreeTDS
Description = MSSQL
Trace = No
Servername = mssql
Database = (データベース名)
Port = 1433

[Default]
Driver = FreeTDS

環境変数を設定しないとちゃんと動かないので設定。

# export ODBCINI=/usr/local/etc/odbc.ini
# export ODBCSYSINI=/usr/local/etc

libiconvコンパイル

# tar xvzf libiconv-1.10.tar.gz
# gunzip libiconv-1.10-cp932.patch.gz
# patch -p0 < libiconv-1.10-cp932.patch
# cd libiconv-1.10
# ./configure
# make
# make install

ここまでやってから、ようやくSQLServerにテスト接続。

# tsql -S mssql -U (ID) -P (パスワード)

“1>”って出たら接続成功です。quitで切断し、今度は別のやり方で接続。

# isql -v mssql (ID) (パスワード)

エラーで動かない…とりあえず放置してPHPで接続を試す。

<?php
$dbh = new PDO('dblib:host=(IPアドレス):1433;dbname=(データベース名)', '(ID)', '(パスワード)');
?>

繋がった! この記述方法もネット上では書いてあることバラバラで苦労したけど、とにかく接続できました。

上記の事を手探り状態で試行錯誤しつつやっていったんで、かなり大変でした。ホントはWindows Serverが客先にあって、それの外部接続だODBCだポート開放だをやりに行ったのも大変だったんだけど、もういいや。

これでようやくシステム開発に取り掛かることが出来ます。

コメントを残す

メールアドレスが公開されることはありません。