【问题标题】:MSSQL Server's Native ODBC Driver for Linux and PHP 5.4适用于 Linux 和 PHP 5.4 的 MS SQL Server Native ODBC 驱动程序
【发布时间】:2012-05-30 11:51:27
【问题描述】:

我在 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 的 Native ODBC Driver?

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

【问题讨论】:

  • 注意肯定有问题 - 只是尝试提供建议,直到合适的人打开问题。 1)检查“无法打开”目录的权限 - 确保 apache(或 www,或任何 PHP 运行方式)可以读取/打开该目录/文件。 2) 您是否为 PHP PDO 尝试过“通用”而不是“unixODBC”?
  • 抱歉,“通用”是什么意思?我该如何测试?
  • 当你用“--with-pdo-odbc=unixODBC”编译时,还有一个“--with-pdo-odbc=generic,dir,libname,ldflags,cflags”版本——没有想知道它是否会起作用,因为我从来没有做过,但是如果没有其他人给出任何指示,只是向你扔一些东西来尝试。
  • 我最近得到了一个更新版本的驱动程序,在 Ubuntu 16.04 和 php7 上运行良好,见这里:stackoverflow.com/a/37312824/55267

标签: php sql-server linux odbc


【解决方案1】:

我知道这有点晚了,但是由于我在遇到完全相同的问题时遇到了这个问题,所以这里有一些建议给以后遇到它的人:-)

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/

祝你好运!

【讨论】:

    【解决方案2】:

    MSSQL Server 的 Linux 原生 ODBC 驱动程序上有一个bug

    要正确连接 MS SQL Server,请使用 FreeTDS 查看更多详情:PHP 5.4 on Linux: How to connect with MS SQL Server 2008?

    【讨论】:

      【解决方案3】:

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

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-08
            • 1970-01-01
            • 2018-09-30
            • 2015-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-16
            相关资源
            最近更新 更多