PHP PDO_mssql SQLSTATE [01002] Не удалось подключиться к адаптивному серверу (серьезность 9)

Я подключаюсь к внешней базе данных MSSQL для экспорта из PHP55/osx, и у меня есть странная проблема.

код:

new \PDO("dblib:host={$hostname};dbname={$dbname}", $user, $pass);

броски:

SQLSTATE[01002] Adaptive Server connection failed (severity 9)

но соединение с CLI работает исправно

tsql -S имя хоста -U пользователь -P pass -L имя_базы:

locale is "cs_CZ.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1> 

freetds.conf:

[hostname]
    host = ipaddress
    port = 1433
    tds version = 8.0

tsql -C:

                        Version: freetds v0.91
         freetds.conf directory: /usr/local/Cellar/freetds/0.91/etc
 MS db-lib source compatibility: no
    Sybase binary compatibility: no
                  Thread safety: yes
                  iconv library: yes
                    TDS version: 7.1
                          iODBC: no
                       unixodbc: no
          SSPI "trusted" logins: no
                       Kerberos: no

Любые идеи? Я пробовал alomost что угодно, подключился к hostname, ip, с и без порта, к имени экземпляра, другому пользователю, TDS версии 7.0,7.1,7.2,8.0, переустановить php и freetds

Ответ 1

Отметьте:

  • найдите freetds.conf на вашем диске. Возможно, он существует в нескольких местах, а tsql использует один, а PHP - другой. Лучше всего символизировать их в один общий файл и проверить на это. Обратите внимание: общее место для этого файла - ~/.freetds.conf рядом с/etc/или/usr/local/etc/

  • должен быть раздел [global] вашего файла freetds.conf. Поместите туда следующие строки:

    tds version = 8.0

    размер текста = 20971520

    клиент charset = UTF-8

Конечно, я ожидаю, что вы уже проверили, какой драйвер загружается PHP с помощью phpinfo(): mssql, sqlsrv или dblib

Ответ 2

Это общее сообщение об ошибке. По какой-либо причине вы не можете подключиться к базе данных. Учитывая, что вы используете OSX и brew, скорее всего, проблема заключается в связывании/загрузке разделяемой библиотеки. FreeTDS основан на Sybase 8 (как и MS SQL Server). Это немного загадочно для компиляции с.

Был ли ваш PHP связан с libsybdb.dylib, который устанавливает brew? Вы должны иметь возможность узнать, используя phpinfo(), если это включено в ваш сервер:

Настроить команду '--with-pdo-dblib = shared,/usr/local/Cellar/freetds/0.91/lib'

Чтобы заставить его работать, вам нужно скомпилировать/создать свой PHP с помощью опции dblib.

Ответ 3

Мое решение:

Получить FreeTds

  • brew install freetds
  • скопируйте все в папке lib/вашей установки freetds в папку lib/вашей директории установки PHP, заменив старые версии: libct.4.dylib, libct.a, libct.dylib, libsybdb.5.dylib, libsybdb. a, libsybdb.dylib

Скомпилируйте и установите расширение dblib

  • загрузите исходный код php для любой установленной вами версии php
  • перейдите в подпапку ext/pdo_dblib источника
  • запустите phpize, убедившись, что это правильный бинарный файл для вашей установки
  • выполните команду configure, например, с помощью параметры: ./configure --with-php-config=/usr/local/php5/bin/php-config --with-pdo-dblib=/usr/local/Cellar/freetds/0.95.19/
  • запустить make
  • скопируйте modules/pdo_dblib.so в каталог установки PHP, заменив старую версию