在windows环境下,连接SQL Server还是比较容易实现的,可以通过微软上面下载扩展驱动sqlsrv,或者通过odbc方式,例如下载最新版的xampp就能够直接打开extension=php_pdo_odbc.dll 就能够使用odbc方式连接,还有mssql也可以,freetds也提供了windows版本的扩展。
但在linux下就比较麻烦一点,毕竟微软的东西原本就不想跟linux有太多的关联,不过我们在开发项目的过程当也难免会遇到使用linux服务器,但需要连接的却是另一台windows服务器下面的SQL Server的情形,这两天刚好研究整理了一下,记录了配置及安装的过程。
首先我们需要的是配置SQL Server2008可以远程访问,这个步骤我就不详述了,可以百度查找相关教程,或者通过链接:http://jingyan.baidu.com/article/fec4bce226a264f2618d8ba5.html 按照上面的操作一下。
接下来就是要安装相差的驱动了,在linux系统下,我们需要:
linux系统下的unixODBC ( http://www.unixodbc.org );
连接SQL Server的驱动 Freetds ( http://www.freetds.org );
安装unixODBC
# tar -zxvf unixODBC-2.3.4.tar.gz
# cd unixODBC-2.3.4
# ./configure --prefix=/usr/local/unixODBC --includedir=/usr/include --libdir=/usr/lib -bindir=/usr/bin --sysconfdir=/etc
# make && make install
安装完成后找到php.ini文件加入:
[PDO_ODBC]
extension=pdo_odbc.so
重启php;
安装Freetds
# tar -zxvf freetds-patched.tar.gz
# cd freetds-1.00.40
# ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC --with-tdsver=7.3
# make && make install
如果在安装unixODBC过程中报 unknown type name 'function_entry' ,则有可能是php版本不一样导致的,只需要找到报错对应的那个xxx.c文件,vim编辑,找到function_entry改成 zend_function_entry保存退出重新编译即可。
如果在安装freetds过程中报 sql.h not found 的错误,则是找不到unixODBC的安装路径导致的,上面的编辑已经指定地址,若指定仍报错,可能是安装的路径不是上面那个,此时可以利用find / -name 'unixODBC*' 查找下具体的安装路径文件夹在哪里。
还有一点需要注意的是,上面的freetds安装配置的时候,--with-tdsver=7.3这个是指定版本的,7.3正好配对SQL Server2008,具体的对应安装版本可以查看freetds的相关文档,地址:http://www.freetds.org/userguide/choosingtdsprotocol.htm#AEN910
可以在安装完成freetds之后查看相关版本号:
以上的安装完成之后,还需要修改odbc的配置文件,以支持odbc的操作。
# vim /etc/odbcinst.ini
在odbcinst.ini里面加入:
[SQL Server]
Description = ODBC for SQL Server
Driver = /usr/local/freetds/lib/libtdsodbc.so
Setup = /usr/local/freetds/lib/libtds.so
FileUsage = 1
到此,环境基本配置完成,接下来就可以利用odbc的方式连接SQL Server数据库了,下面是php的测试连接代码:
try{
$cnx = new PDO("odbc:Driver={SQL Server};Server=1.1.1.1,1433;Database=database;",'username','password');
}catch (PDOException $e){
echo $e->getMessage();
}
var_dump($cnx);
$a = $cnx->query("SELECT * FROM [user]");
var_dump($a);
foreach ($a as $b) {
var_dump($b);
}
exit;