Ошибка PHP-подключения к базе данных MS SQL с использованием PDO_DBLIB

Я пытаюсь использовать драйвер PHP PDO_DBLIB для подключения к удаленной базе данных, и у меня есть некоторые проблемы.

База данных подключается через ту же среду, используя telnet и клиент SQL. Однако подключение с использованием следующего кода в PHP не работает:

<?php
$conn = new PDO('dblib:dbname=TestDB;host=RemoteServer;charset=utf8', 'my_user', 'my_pass');

Запуск этого кода, будь то из командной строки или Apache, приводит к следующей ошибке:

Неустранимая ошибка: исключить исключение "PDOException" с сообщением "SQLSTATE [HY000] Не удается подключиться: Adaptive Server недоступен или не существует (серьезность 9)"

Я могу подключиться к базе данных, используя тот же код на другом веб-сервере, что заставляет меня думать, что это проблема конфигурации. Файлы php.ini на двух серверах выглядят относительно одинаковыми. У каждого из них есть те же библиотеки PDO, что и с теми же настройками.

Кто-нибудь знает, почему это может произойти?

Ответ 1

Оказывается, это была гораздо более простая проблема, чем я думал. По какой-то причине сервер разработки не использовал порт 1433 в качестве порта по умолчанию в соединении и вместо этого использовал порт 4000.

Я обнаружил это, включив журналы в файле freetds.conf и отслеживая их, когда я делал запрос.

Также следует отметить: расширение DBLIB использует двоеточие (:) как разделитель между хостом и портом вместо запятой. К сожалению, ошибка, которую вы получаете при использовании запятой, не очень описательна, поэтому, надеюсь, кто-то приносит пользу от этого открытия.

Ответ 2

Запишите порт в freetds.conf непосредственно для этого хоста:

[RemoteServer]
    host = RemoteServer
    port = 1433

И оставить php-код, которым мы являемся:

$conn = new PDO('dblib:dbname=TestDB;host=RemoteServer;charset=utf8', 'my_user', 'my_pass');