won*_*r95 3 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
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
/opt/local/etc/odbc.ini:
[bti_dsn]
Driver = FreeTDS
Description = My Database
Trace = no
Servername = bti_db
Database = btidata
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试使用'bti_dsn'连接odbc_connect()
$conn = odbc_connect('bti_dsn;, $user, $pw);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
警告:odbc_connect()[function.odbc-connect]:SQL错误:[iODBC] [驱动程序管理器]未找到数据源名称且未指定默认驱动程序.无法加载驱动程序,SQL状态IM002在SQLConnect中
在我的phpinfo()的ODBC部分中,我看到ODBC库定义为iodbc,而PHP是用'--with-iodbc =/usr'编译的,所以我猜测配置是我的问题.我如何解决这个问题,以便它使用我设置的unixODBC/FreeTDS?
谢谢.
iODBC默认安装为Mac OS X的一部分; 自从Jaguar(10.2.x)以来.在Mac上不需要UnixODBC,如果你不是一个认真的专家,它会导致很多错误.在Mac OS X上有一个使用PHP和iODBC的具体指南.为获得最佳效果,您可能还需要升级到适用于Mac OS X的最新iODBC.
/opt/local/etc应该不添加到您的$PATH通过.profile或以其他方式.
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驱动程序不会加载.)
对于特定错误,您的报告 - 如果您没有使用Mac的默认ODBC配置文件,则需要设置几个环境变量(系统级别在/Library/ODBC/odbc[inst].ini;用户级别在~/Library/ODBC/odbc[inst].ini......如果存在~/.odbdc[inst].ini文件,它们应该被混合到~/Library/ODBC/文件中并由符号链接替换为相同的文件.
如果你不希望使用iODBC的,或不想使用这些默认的文件,你必须设置$ODBCINI为目标的odbc.ini地方已经定义了你的DSN文件,并$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");
Run Code Online (Sandbox Code Playgroud)
我无法准确了解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");
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
PS在您的DSN定义中,此行 -
Driver = FreeTDS
Run Code Online (Sandbox Code Playgroud)
- 应该改写.应该将人性化的驱动程序名称包装在大括号({FreeTDS})中,或者驱动程序库(/opt/local/lib/libtdsodbc.so)的完整路径应该是值.
Driver = {FreeTDS}
Driver = /opt/local/lib/libtdsodbc.so
Run Code Online (Sandbox Code Playgroud)
我假设你也有类似下面的索引条目odbcinst.ini-
[ODBC Drivers]
FreeTDS = Installed
Run Code Online (Sandbox Code Playgroud)
- 和你的下列索引条目类似odbc.ini-
[ODBC Data Sources]
bti_dsn = FreeTDS
Run Code Online (Sandbox Code Playgroud)
...但现在我注意到你的$ conn线可能只需要修正.看看参数odbc_connect.
$conn = odbc_connect('bti_dsn;, $user, $pw);
Run Code Online (Sandbox Code Playgroud)
这应该看起来更像 -
$conn = odbc_connect("bti_dsn", "$user", "$pw");
Run Code Online (Sandbox Code Playgroud)