Назад | Перейти на главную страницу

Драйвер DBLIB PDO продолжает давать сбой при попытке подключиться / запросить базу данных Microsoft Azure SQL

Итак, я использую Linux (ubuntu) и пытаюсь подключиться к базе данных Microsoft Azure SQL.

Информация о сервере:

Настройки Freetds.conf:

[global]
    dump file = /tmp/freetds.log
    debug flags = 0xffff
    text size = 64512

[a1a1a1a1a1.database.windows.net]
    host = a1a1a1a1a1.database.windows.net
    port = 1433
    tds version = 8.0
    client charset = UTF-8

Когда я бегу

php -r "phpinfo();" | grep "PDO drivers"

в терминале он возвращается

PDO drivers => dblib, mysql

поэтому, насколько мне известно, все настройки и драйверы устанавливаются такими, какими они должны быть.

Итак, теперь об ошибках:

ОШИБКА 1

Если я инициализирую PDO так:

$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

он подключается, но если я удалю пробелы вокруг символа '=' для dbname следующим образом:

$conn = new \PDO ( "dblib:dbname=MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

он возвращает эти ошибки из PDOException и freetds.log

SQLSTATE[HY000] General SQL Server error: Check messages from the SQL Server (severity 16)

(dbutil.c:86):msgno 40508: "USE statement is not supported to switch between databases. Use a new connection to connect to a different Database."

ОШИБКА 2

Когда я запускаю следующий код

try {
    $conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
    $conn->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
    $statement = $conn->prepare("SELECT * FROM dbo.Sloth");
    $result = $statement->execute();
}
catch ( PDOException $e ) {
    print( "Error connecting to SQL Server." );
    die(print_r($e));
}

он прерывается в строке $ result = ... с этими ошибками из PDOException и freetds.log

SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)] 

(dbutil.c:86):msgno 208: "Invalid object name 'dbo.Sloth'."

но когда я запускаю запрос

SELECT * FROM dbo.Sloth

на портале управления базами данных Azure он возвращает все правильные строки.

Мы будем очень благодарны за любую помощь в этих вопросах!

РЕДАКТИРОВАТЬ

В ходе некоторых тестов я обнаружил, что обе проблемы связаны с тем, что PDO не подключается к базе данных, а вместо этого подключается к «мастеру». Это объясняет ошибку неверного имени объекта ERROR 2.

Есть мысли о том, почему код в ERROR 1 не подключается к MyDatabase?

РЕШЕНИЕ

Я использовал PHP 5.3.10, в котором все еще была ошибка: https://bugs.php.net/bug.php?id=64338

Оказывается, драйвер PDO выполнял инструкцию USE, которая не нравится базе данных SQL Microsoft Azure.

Я обновился до PHP 5.4.21, и все заработало.