首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iODBC尝试使用unixODBC/FreeTDS在PHP中连接到MS SQL Server时出错

iODBC尝试使用unixODBC/FreeTDS在PHP中连接到MS SQL Server时出错
EN

Stack Overflow用户
提问于 2010-07-15 12:49:58
回答 2查看 4.9K关注 0票数 3

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

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

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

代码语言:javascript
复制
[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:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
[bti_dsn]
Driver = FreeTDS
Description = My Database
Trace = no
Servername = bti_db
Database = btidata

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

代码语言:javascript
复制
$conn = odbc_connect('bti_dsn;, $user, $pw);

我得到了这个错误:

警告: odbc_connect()函数。found connect: SQL错误:未找到iODBCData源名称且未指定默认驱动程序。无法加载驱动程序,SQLConnect中的SQL状态为IM002

在ODBC部分my phpinfo()中,我看到ODBC Library被定义为iodbc,PHP是用'-- with -iodbc=/usr‘编译的,所以我猜config是我的问题。我如何解决这个问题,使它使用我设置的unixODBC/FreeTDS?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-16 00:44:36

默认情况下,iODBC是作为Mac的一部分安装的;从Jaguar (10.2.x)开始就已经安装了。没有必要在Mac上安装UnixODBC,如果你不是一个专业的专家,它可能会导致很多错误。有一个关于使用PHP with iODBC on Mac OS X的特定指南。为了获得最佳效果,您可能还希望升级到最新的iODBC for Mac OS X

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

PHP肯定会在UnixODBC之前找到iODBC,但这应该不是问题;UnixODBC和iODBC通常是(并且应该是完全)与API等价的ODBC驱动程序管理器。如果您真的关心这一部分,可以更改$DYLD_LIBRARY_PATH (Mac版本的Linux) --但是如果PHP链接到的是iODBC框架,而不是dylib,这不会有任何区别。

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

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

如果您不想使用iODBC,或者不想使用这些默认文件,则必须将$ODBCINI设置为目标odbc.ini文件,并将$ODBCINSTINI设置为注册要使用的驱动程序的odbcinst.ini文件。

假设您想要执行上述所有操作,则应该向*.php文件中添加类似这样的代码行(最好是通过requireinclude语句,以减少将来的编辑) --

代码语言:javascript
复制
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库,则应该可以执行以下操作--

代码语言:javascript
复制
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定义中,此行--

代码语言:javascript
复制
Driver = FreeTDS

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

代码语言:javascript
复制
Driver = {FreeTDS}
Driver = /opt/local/lib/libtdsodbc.so

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

代码语言:javascript
复制
[ODBC Drivers]
FreeTDS = Installed

--在您的odbc.ini中类似以下索引项--

代码语言:javascript
复制
[ODBC Data Sources]
bti_dsn = FreeTDS

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

代码语言:javascript
复制
$conn = odbc_connect('bti_dsn;, $user, $pw);

这应该看起来更像--

代码语言:javascript
复制
$conn = odbc_connect("bti_dsn", "$user", "$pw");
票数 6
EN

Stack Overflow用户

发布于 2010-07-15 14:59:54

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3252549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档