我正在尝试从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()函数。found connect: SQL错误:未找到iODBCData源名称且未指定默认驱动程序。无法加载驱动程序,SQLConnect中的SQL状态为IM002
在ODBC部分my phpinfo()中,我看到ODBC Library被定义为iodbc,PHP是用'-- with -iodbc=/usr‘编译的,所以我猜config是我的问题。我如何解决这个问题,使它使用我设置的unixODBC/FreeTDS?
谢谢。
发布于 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文件中添加类似这样的代码行(最好是通过require或include语句,以减少将来的编辑) --
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");发布于 2010-07-15 14:59:54
它看起来没有在您的odbc.ini文件中查找。也许它正在寻找/etc/odbc.ini和/etc/odbcinst.ini
https://stackoverflow.com/questions/3252549
复制相似问题