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

vin*_*a87 15 php linux sql-server odbc

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

要为Linux安装MSSQL Server的本机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
Run Code Online (Sandbox Code Playgroud)

和我的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
Run Code Online (Sandbox Code Playgroud)

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

$ isql -v mydsn dbusername dbpassword
Run Code Online (Sandbox Code Playgroud)

我成功了:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
Run Code Online (Sandbox Code Playgroud)

然后,使用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
Run Code Online (Sandbox Code Playgroud)

在我的phpinfo()上我得到:

PDO support - enabled
PDO drivers - odbc

PDO Driver for ODBC (unixODBC) - enabled
ODBC Connection Pooling        - Enabled, strict matching
Run Code Online (Sandbox Code Playgroud)

现在是时候测试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>";
    }
?>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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/

祝好运!


vin*_*a87 2

适用于 Linux 的 MSSQL Server 的本机 ODBC 驱动程序存在错误

要正确连接 MS SQL Server,请使用 FreeTDS 查看更多详细信息:Linux 上的 PHP 5.4:如何连接 MS SQL Server 2008?