用于Linux和PHP 5.4的MSSQL Server的本机ODBC驱动程序

时间:2012-05-23 21:40:30

标签: php sql-server linux odbc

我在Linux Debian 6 x64上安装了Apache 2.2.16和PHP 5.4.3。

要安装MSSQL Server的Linux本机ODBC驱动程序,我使用以下说明: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/

我以这种方式配置了我的odbc.ini文件:

[mydsn]
Driver      = SQL Server Native Client 11.0
Database    = datbase
Server      = xxx.xxx.xxx.xxx,port

和我的odbcinst.ini这样:

[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
Threading=1
UsageCount=1

要测试,我运行以下命令:

$ isql -v mydsn dbusername dbpassword

我获得了成功:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

然后,使用phpize在PHP 5.4上安装unixODBC,使用: (使用了第一个命令ln -s ...,因为./configure在默认位置找不到php的标题)

$ sudo ln -s /usr/include/php5 /usr/include/php
$ phpize
$ ./configure --with-pdo-odbc=unixODBC && make && make test
$ sudo make install

在我的phpinfo()上,我得到了:

PDO support - enabled
PDO drivers - odbc

PDO Driver for ODBC (unixODBC) - enabled
ODBC Connection Pooling        - Enabled, strict matching

现在是时候测试PHP 5.4脚本上的所有内容了:

<?php
    ini_set('display_errors', 1);
    error_reporting(E_ALL);

    $conn = new PDO('odbc:DSN=mydsn;UID='.$usr.';PWD='.$psw);

    $query = 'select * from my_table'; 
    $stmt = $conn->prepare($query);
    $stmt->execute();
    while ($row = $stmt->fetch()) {
        echo "<pre>";
        print_r($row);
        echo "</pre>";
    }
?>

但它不起作用......我收到此错误消息:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[01000] SQLDriverConnect: 0 
[unixODBC][Driver Manager]Can't open lib '/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0' : file not found' 
in /var/www/testemssql.php:17 
Stack trace: 
#0 /var/www/testemssql.php(17): PDO->__construct('odbc:DSN=mydsn...') 
#1 {main} thrown in /var/www/testemssql.php on line 17

所以我的问题是:发生了什么?我缺少什么配置? 如何在Linux和PHP 5.4上正确设置MSSQL Server的本机ODBC驱动程序?

Ps。:当我尝试使用odbc_connect()时,PHP表示该函数不存在。

5 个答案:

答案 0 :(得分:5)

我知道这有点晚了,但是因为我在碰到这个问题的时候遇到了同样的问题,所以对于今后遇到它的人都有一些建议: - )

1)检查libsqlncli-11.0.so.1790.0的权限,以确保Apache正在运行的任何用户可以访问它(应该具有读取和执行)

2)使用ldd检查没有任何依赖项丢失 - 基于isql正在运行的事实我会说它们没问题(提示:你正在寻找“未找到”):

ldd /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0

3)尝试从命令行而不是通过Apache运行php脚本。如果它是这样的,那就去停止4.如果没有,我建议通过strace来看看它到底在做什么。

4)这是为我做的!尝试关闭SELinux(即设置为不强制/许可模式)并再次点击Apache中的页面。我不确定它究竟是什么阻挡(没有时间或倾向于进入细节)但是一旦它关闭,一切都像一个魅力。对于任何有倾向的人我都可以深入研究并找出如何在不完全禁用的情况下解决这个问题: - )

禁用SELinux的确切命令可能因您的操作系统而异,但对我来说(在CentOS上)这有效:

http://rbgeek.wordpress.com/2012/08/06/how-to-disable-selinux-on-centos-without-rebooting/

祝你好运!

答案 1 :(得分:2)

MSSQL Server的Linux本机ODBC驱动程序上有bug

要正确连接MS SQL Server,请使用FreeTDS 有关详细信息,请参阅:PHP 5.4 on Linux: How to connect with MS SQL Server 2008?

答案 2 :(得分:1)

相同的配置,odbcinst.ini除外:

[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
UsageCount=1

删除此行后重试:

Threading=1

你的PHP脚本对我来说很好。

希望这可以帮助你。

答案 3 :(得分:1)

如果使用附加到https://bugs.php.net/bug.php?id=61777的补丁修补和重新编译php,它将解决问题。

另请查看此博客文章,了解有关DSN和用法的示例:

http://strangenut.com/blogs/dacrowlah/archive/2012/04/13/installing-and-using-the-microsoft-sql-server-odbc-driver-for-linux.aspx

答案 4 :(得分:0)

我自己从未有机会尝试过,但我听说php5-sybase工作正常,我知道存储库中的Debian和Ubuntu都可用。