簡體   English   中英

iODBC錯誤嘗試使用unixODBC / FreeTDS連接到PHP中的MS SQL Server

[英]iODBC error trying to connect to MS SQL Server in PHP with unixODBC/FreeTDS

我正在嘗試從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] [驅動程序管理器]未找到數據源名稱且未指定默認驅動程序。 無法加載驅動程序,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以定位您已定義DSN的odbc.ini文件,並將$ODBCINSTINI定位到odbcinst.ini注冊要使用的驅動程序的odbcinst.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");

我希望這有幫助。

PS在您的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");

它看起來好像沒有查看你的odbc.ini文件。 也許它正在尋找/etc/odbc.ini/etc/odbcinst.ini

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM