我正在尝试从Mac上的PHP连接到远程MS SQL Server DB(最终在一个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/本地/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()[函数.odbc connect]:SQL错误:[iodbc][driver manager]找不到数据源名称,未指定默认驱动程序。无法加载驱动程序,sqlconnect中的sql state im002
在odbc部分my phpinfo()中,我看到定义为iodbc的odbc库,php是用“--with iodbc=/usr”编译的,所以我猜配置是我的问题。我如何绕过这个问题,以便它使用我已经建立的UNIXOBC/FRIETDS?
谢谢。
最佳答案
iODBC默认安装为Mac OS X的一部分;从捷豹(10.2.x)开始。在Mac上不需要UNIXODBC,如果你不是一个严肃的专家,它会导致很多错误。有一个使用PHP with iODBC on Mac OS X的特定指南。为了获得最佳结果,您可能还需要升级到最新的iODBC for Mac OS X。/opt/local/etc
不应添加到您的$PATH
、通过.profile
或其他方式。
php肯定是在unixodbc之前找到了iodbc,但这不应该是个问题;unixodbc和iodbc通常是(并且应该是完全)api等效的odbc驱动程序管理器。如果你真的关心这一部分,你可以改变$DYLD_LIBRARY_PATH
(Mac OS X的Linux版本$LD_LIBRARY_PATH
)——但是如果PHP是与IdBoc框架链接的,而不是DyLIB,这不会有任何区别。
(请注意,$DYLD_LIBRARY_PATH
还必须包含/opt/local/lib
,否则您的freetds驱动程序将不会加载。)
对于特定的错误,如果不使用mac的默认odbc配置文件(系统级在/Library/ODBC/odbc[inst].ini
中,用户级在~/Library/ODBC/odbc[inst].ini
中),那么您的报告——php需要设置几个环境变量。如果存在~/.odbdc[inst].ini
文件,则应将它们混合到~/Library/ODBC/
文件中,并替换为指向该文件的符号链接)。
如果您不想使用iodbc,或者不想使用这些默认文件,则必须将$ODBCINI
设置为以定义dsn的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");