15

我在 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

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

4

5 回答 5

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/

祝你好运!

于 2013-07-31T07:53:58.940 回答
2

MSSQL Server's Native ODBC Driver for Linux 有一个bug

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

于 2012-10-01T12:35:40.950 回答
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 脚本对我来说很好。

希望这可以帮助你。

于 2012-12-14T09:22:45.960 回答
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

于 2013-01-15T17:11:41.060 回答
0

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

于 2012-09-07T23:56:44.460 回答