【问题标题】:iODBC error trying to connect to MS SQL Server in PHP with unixODBC/FreeTDSiODBC 错误尝试使用 unixODBC/FreeTDS 连接到 PHP 中的 MS SQL Server
【发布时间】:2011-03-16 05:13:28
【问题描述】:

我正在尝试从 Mac 上的 PHP 连接到远程 MS SQL Server 数据库(最终在 Ubuntu 服务器上(使用 FreeTDS 和 unixODBC,但即使我似乎已经正确设置了所有内容,但我收到了 iODBC 错误,而且我不确定如何绕过它们。

我使用的是 MacPorts,所以我的配置是:

/opt/local/etc/freetds.conf::

[bti_db]
host = 123.45.67.89 (IP address changed to protect the innocent)
port = 14333
tds version = 8.0

/opt/local/etc/odbcinst.ini:

[FreeTDS]
Description = TDS Driver (Sybase/MSSQL)
Driver = /opt/local/lib/libtdsodbc.so
Setup = /opt/local/lib/libtdsS.so
FileUsage = 1

/opt/local/etc/odbc.ini:

[bti_dsn]
Driver = FreeTDS
Description = My Database
Trace = no
Servername = bti_db
Database = btidata

但是,每当我尝试使用 'bti_dsn' 连接 odbc_connect() 时

$conn = odbc_connect('bti_dsn;, $user, $pw);

我收到此错误:

警告:odbc_connect() [function.odbc-connect]:SQL 错误:[iODBC][Driver Manager]未找到数据源名称且未指定默认驱动程序。无法加载驱动程序,SQLConnect 中的 SQL 状态为 IM002

在我的 phpinfo() 的 ODBC 部分中,我看到 ODBC 库定义为 iodbc,并且 PHP 是使用“--with-iodbc=/usr”编译的,所以我猜测配置是我的问题。我怎样才能解决这个问题,以便它使用我设置的 unixODBC/FreeTDS?

谢谢。

【问题讨论】:

    标签: php sql-server odbc


    【解决方案1】:

    iODBC 默认安装为 Mac OS X 的一部分;从 Jaguar (10.2.x) 开始。 Mac 上不需要 UnixODBC,如果您不是认真的专家,它可能会导致很多错误。有一个使用PHP with iODBC on Mac OS X 的具体指南。为获得最佳效果,您可能还需要升级到最新的iODBC for Mac OS X

    /opt/local/etc 不应该通过.profile 或其他方式添加到您的$PATH

    PHP 肯定会在 UnixODBC 之前找到 iODBC,但这应该不是问题; UnixODBC 和 iODBC 通常是(并且完全是)API 等效的 ODBC 驱动程序管理器。如果您真的关心那部分,您可以更改$DYLD_LIBRARY_PATH(Mac OS X 版本的 Linux 的$LD_LIBRARY_PATH)——但如果 PHP 与 iODBC 框架链接,而不是 dylibs,这不会有所作为。

    (请注意,$DYLD_LIBRARY_PATH 还必须包含 /opt/local/lib 否则您的 FreeTDS 驱动程序将无法加载。)

    对于您报告的具体错误 -- PHP 需要设置几个环境变量,如果您不使用 Mac 的默认 ODBC 配置文件(系统级别在 /Library/ODBC/odbc[inst].ini;用户级别在 ~/Library/ODBC/odbc[inst].ini ...如果存在 ~/.odbdc[inst].ini 文件,则应将它们混合到 ~/Library/ODBC/ 文件中并用符号链接替换)。

    如果您不想使用 iODBC,或者不想使用那些默认文件,则必须将 $ODBCINI 设置为指向您定义 DSN 的 odbc.ini 文件,并设置 $ODBCINSTINIodbcinst.ini 文件为目标,该文件注册您要使用的驱动程序。

    假设您要执行上述所有操作,则应将此类行添加到您的 *.php 文件中(最好通过 requireinclude 语句以最大程度地减少将来的编辑)--

    putenv("DYLD_LIBRARY_PATH=/path/to/odbcsdk/lib;$DYLD_LIBRARY_PATH");
    putenv("ODBCINSTINI=/path/to/odbcinst.ini");
    putenv("ODBCINI=/path/to/odbc.ini");
    

    我无法准确了解DYLD_LIBRARY_PATH 设置,因为您没有指定 UnixODBC 库的位置。但是,如果您对 iODBC 作为驱动程序管理器感到满意,并且只想加载您的 FreeTDS 库,那么以下应该可以工作 --

    putenv("DYLD_LIBRARY_PATH=/opt/local/lib;$DYLD_LIBRARY_PATH");
    putenv("ODBCINSTINI=/opt/local/etc/odbcinst.ini");
    putenv("ODBCINI=/opt/local/etc/odbc.ini");
    

    我希望这会有所帮助。

    附:在您的 DSN 定义中,这一行 --

    Driver = FreeTDS
    

    -- 应该重写。友好的驱动程序名称应该用大括号括起来 ({FreeTDS}),或者驱动程序库的完整路径 (/opt/local/lib/libtdsodbc.so) 应该是值。

    Driver = {FreeTDS}
    Driver = /opt/local/lib/libtdsodbc.so
    

    我假设您的odbcinst.ini 中也有类似以下索引条目的内容--

    [ODBC Drivers]
    FreeTDS = Installed
    

    -- 以及您的odbc.ini 中的以下索引条目--

    [ODBC Data Sources]
    bti_dsn = FreeTDS
    

    ...但现在我注意到您的 $conn 行可能只需要更正。查看odbc_connect 的参数。

    $conn = odbc_connect('bti_dsn;, $user, $pw);
    

    这应该看起来更像——

    $conn = odbc_connect("bti_dsn", "$user", "$pw");
    

    【讨论】:

    • 该;在 odbc_connect 中是帖子中的错字,而不是代码本身。
    • 谢谢,这成功了。这是我所做的:将 [ODBC 数据源] 添加到 odbc.ini,因为我没有,将 [ODBC 驱动程序] 添加到 odbcinst.ini,因为我也没有。将 [bti_dsn] 中的驱动程序值更改为 /path/to/libtdsodbc.so 添加了 putenv("ODBCINSTINI=/opt/local/etc/odbcinst.ini");和 putenv("ODBCINI=/opt/local/etc/odbc.ini");到我的脚本。奇迹般有效。非常感谢。
    • 我没有 /opt 目录,也找不到 odbc.ini 或 odbcinst.ini 文件。我能做些什么?我的 MAMP 目录中有 libtdsodbc.0.0.0.so(我认为这是我自己编译并复制到 MAMP 库目录(/Applications/MAMP/Library/lib/)的那个)。会不会是 MacOSX 默认不提供它们?
    • PS:我按照这个说明没有运气(使用 PHP 5.3.6 和 FreeTDS 0.82):tumblr.com/tagged/mssql+mamp+php+mac+osx
    • @GarciaWebDev - 您说您遵循的说明根本不涉及 ODBC 连接。那些专注于特定于 MSSQL 的 PHP 连接和编码,在这里不会很好地映射。我建议您提出自己的新问题,并提供尽可能多的信息,以便人们做出有用的回应...
    【解决方案2】:

    看起来它没有在您的 odbc.ini 文件中查找。也许它正在寻找/etc/odbc.ini/etc/odbcinst.ini

    【讨论】:

    • 好吧,在我意识到它们有 MacPorts 之前,我已经直接安装了它们,它们位于 /usr/local/unixODBC-2.3.0/etc 下,我也遇到了同样的问题。你认为这可能只是将 /opt/local/etc 添加到我的路径的问题吗?
    • 好的,我将 /opt/local/etc 添加到 .profile 中的路径并重新启动,但仍然出现相同的错误。
    • TallTed 有答案。 OSX 特定路径。 :-)
    猜你喜欢
    • 2016-10-22
    • 2012-08-11
    • 2018-04-23
    • 2011-02-23
    • 1970-01-01
    • 2014-11-06
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多