gpt4 book ai didi

php - 尝试使用 unixODBC/FreeTDS 在 PHP 中连接到 MS SQL Server 时出现 iODBC 错误

转载 作者:可可西里 更新时间:2023-11-01 00:38:02 25 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

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 应该通过 .profile 添加到您的 $PATH 或者否则。

PHP 肯定会在 UnixODBC 之前找到 iODBC,但这应该不是问题; UnixODBC 和 iODBC 通常(并且应该是完全的)API 等效的 ODBC 驱动程序管理器。如果您真的很关心那部分,您可以更改 $DYLD_LIBRARY_PATH(Linux 的 Mac OS X 版本的 $LD_LIBRARY_PATH)——但是如果 PHP 链接到 iODBC框架,而不是动态库,这不会有任何区别。

(请注意,$DYLD_LIBRARY_PATH 还必须包含 /opt/local/lib,否则您的 FreeTDS 驱动程序将不会加载。)

对于您报告的特定错误——PHP 需要设置几个环境变量,如果您没有使用 Mac 的默认 ODBC 配置文件(系统级别位于 /Library/ODBC/odbc[inst .ini; 用户级别在~/Library/ODBC/odbc[inst].ini ...如果有~/.odbdc[inst].ini 文件存在,它们应该混合到 ~/Library/ODBC/ 文件中,并替换为相同的符号链接(symbolic link))。

如果你不想使用 iODBC,或者不想使用那些默认文件,你必须设置 $ODBCINI 来定位 odbc.ini定义 DSN 的文件,以及 $ODBCINSTINIodbcinst.ini 文件为目标,该文件注册了您要使用的驱动程序。

假设您想要执行以上所有操作,应该将像这样的行添加到您的 *.php 文件中(最好通过 requireinclude 语句以尽量减少将来的编辑)--

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");

关于php - 尝试使用 unixODBC/FreeTDS 在 PHP 中连接到 MS SQL Server 时出现 iODBC 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3252549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com