Ошибка iODBC при попытке подключения к MS SQL Server в PHP с помощью unixODBC / FreeTDS - PullRequest
3 голосов
/ 15 июля 2010

Я пытаюсь подключиться к удаленной базе данных MS SQL Server из PHP на Mac (в конце концов, на сервере 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

Однако всякий раз, когда япопробуйте соединиться с odbc_connect (), используя 'bti_dsn'

$conn = odbc_connect('bti_dsn;, $user, $pw);

Я получаю эту ошибку:

Предупреждение: odbc_connect () [function.odbc-connect]: ошибка SQL: [iODBC] [Driver Manager] Имя источника данных не найдено и драйвер по умолчанию не указан. Драйвер не может быть загружен, состояние SQL IM002 в SQLConnect

В разделе ODBC мой phpinfo (), я вижу ODBC Library, определенную как iodbc,и PHP скомпилирован с '--with-iodbc = / usr', поэтому я предполагаю, что конфиг - это моя проблема. Как я могу обойти это так, чтобы он использовалunixODBC / FreeTDS Я настроил?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 15 июля 2010

iODBC установлен по умолчанию как часть Mac OS X;был с Ягуара (10.2.x).Нет необходимости в UnixODBC на Mac, и это может привести к множеству ошибок, если вы не являетесь серьезным экспертом.Существует специальное руководство по использованию PHP с iODBC в Mac OS X .Для достижения наилучших результатов вам также может потребоваться обновление до последней версии iODBC для Mac OS X .

/opt/local/etc, если не добавить к вашему $PATH,через .profile или иначе.

PHP определенно находит iODBC до UnixODBC, но это не должно быть проблемой;UnixODBC и iODBC обычно (и должны быть полностью) API-эквивалентными менеджерами драйверов ODBC.Если вы действительно обеспокоены этой частью, вы можете изменить $DYLD_LIBRARY_PATH (версия MacOS X для Linux $LD_LIBRARY_PATH) - но если PHP был связан с фреймворками iODBC, в отличие от dylibs, это не будетиметь какое-либо значение.

(Обратите внимание, что $DYLD_LIBRARY_PATH также должен включать /opt/local/lib, иначе ваш драйвер FreeTDS не будет загружаться.)

Для конкретной ошибки в вашем отчете - PHP должен иметь пару окруженийпеременные установлены, если вы не используете файлы конфигурации ODBC для Mac по умолчанию (системный уровень в /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");

Я не могу быть точным в отношении настройки 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 Inваше определение DSN, эта строка -

Driver = FreeTDS

- должна быть переписана.Либо понятное человеку имя драйвера должно быть заключено в фигурные скобки ({FreeTDS}), либо вместо него должен быть указан полный путь к библиотеке драйверов (/opt/local/lib/libtdsodbc.so).

Driver = {FreeTDS}
Driver = /opt/local/lib/libtdsodbc.so

I'mпредполагается, что у вас есть что-то вроде следующей индексной записи в вашем 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");
0 голосов
/ 15 июля 2010

Похоже, что это не выглядит в вашем файле odbc.ini.Может быть, он ищет /etc/odbc.ini и /etc/odbcinst.ini?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...