MSSQL Server's Native ODBC Driver for Linux and PHP 5.4


MSSQL Server's Native ODBC Driver for Linux and PHP 5.4

我在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 时说该函数不存在。

我知道

这有点晚了,但是由于我在撞到完全相同的问题时击中了这个线程,因此对将来遇到它的任何人都有一些建议:-)

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

2) 使用 ldd 检查是否缺少任何依赖项 - 基于 isql 在上面工作的事实,我会说它们没问题(提示:您正在寻找"未找到"):

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

3)尝试从命令行运行php脚本,而不是通过Apache。如果它像这样工作,请转到停止 4。如果没有,我建议运行 strace 看看它实际上在做什么。

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

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

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

祝你好运!

MSSQL Server 的 Linux 原生 ODBC 驱动程序有一个错误

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

相同的配置,除了 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 脚本对我来说很好用。

希望这对您有所帮助。

如果您使用附加到 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

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