iODBC http://www.iodbc.org/默认情况下作为 Mac OS X 的一部分安装;自 Jaguar (10.2.x) 以来一直如此。 Mac 上不需要 UnixODBC,如果您不是认真的专家,它可能会导致很多错误。有具体的使用指南Mac OS X 上的 PHP 和 iODBC http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/IODBCPHPHOWTOMacOSX。为了获得最佳效果,您可能还想升级到最新版本适用于 Mac OS X 的 iODBC http://www.iodbc.org/dataspace/iodbc/wiki/iODBC/Downloads#Mac_OS_X.
/opt/local/etc
should not添加到您的$PATH
, 通过.profile
或其他方式。
PHP 肯定会先于 UnixODBC 找到 iODBC,但这应该不是问题; UnixODBC 和 iODBC 通常(并且应该是完全)API 等效的 ODBC 驱动程序管理器。如果您确实关心该部分,您可以更改$DYLD_LIBRARY_PATH
(Linux 的 Mac OS X 版本$LD_LIBRARY_PATH
)——但是如果 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
您定义 DSN 的文件,以及$ODBCINSTINI
以针对odbcinst.ini
注册您要使用的驱动程序的文件。
假设您想要执行上述所有操作,则应将此类行添加到您的*.php
文件(最好通过require
or 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");