iODBC错误尝试使用unixODBC / FreeTDS连接到PHP中的MS SQL Server

时间:2010-07-15 04:49:58

标签: php sql-server odbc

我正在尝试从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] [驱动程序管理器]未找到数据源名称且未指定默认驱动程序。无法加载驱动程序,SQL状态IM002在SQLConnect

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

感谢。

2 个答案:

答案 0 :(得分:6)

默认情况下,

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

}

}

}

PHP肯定是在UnixODBC之前找到iODBC,但这应该不是问题; UnixODBC和iODBC通常(并且意味着完全)API等效的ODBC驱动程序管理器。如果您真的关心那个部分,可以更改$PATH(Mac OS X版本的Linux .profile) - 但如果PHP与iODBC框架相关联,而不是dylibs,这不会有任何区别。

(请注意,$DYLD_LIBRARY_PATH也必须包含$LD_LIBRARY_PATH,否则您的FreeTDS驱动程序将无法加载。)

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

如果您不想使用iODBC,或者不想使用这些默认文件,则必须设置~/Library/ODBC/odbc[inst].ini以定位您已定义DSN的~/.odbdc[inst].ini文件,和~/Library/ODBC/定位$ODBCINI文件,该文件注册您要使用的驱动程序。

假设您要执行上述所有操作,应将这些行添加到odbc.ini文件中(最好通过$ODBCINSTINIodbcinst.ini语句,以便将来编辑最小化 -

*.php

我无法准确了解require设置,因为您没有指定UnixODBC库的位置。但是,如果你可以将iODBC作为驱动程序管理员,并希望加载FreeTDS库,那么以下内容应该可行 -

include

我希望这会有所帮助。

P.S。在您的DSN定义中,此行 -

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)包装,或者驱动程序库的完整路径(putenv("DYLD_LIBRARY_PATH=/opt/local/lib;$DYLD_LIBRARY_PATH"); putenv("ODBCINSTINI=/opt/local/etc/odbcinst.ini"); putenv("ODBCINI=/opt/local/etc/odbc.ini"); )应该是值。

Driver = FreeTDS

我假设您的{FreeTDS}中还有类似以下索引条目的内容 -

/opt/local/lib/libtdsodbc.so

- 类似于Driver = {FreeTDS} Driver = /opt/local/lib/libtdsodbc.so -

中的以下索引条目
odbcinst.ini

...但现在我注意到你的$ conn线可能只需要修正。查看[ODBC Drivers] FreeTDS = Installed 的参数。

odbc.ini

这应该看起来更像 -

[ODBC Data Sources]
bti_dsn = FreeTDS

答案 1 :(得分:0)

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