Итак, я использую Linux (ubuntu) и пытаюсь подключиться к базе данных Microsoft Azure SQL.
Информация о сервере:
Адрес сервера - a1a1a1a1a1.database.windows.net (a1a1a1a1a1 - это имя моего сервера)
Имя базы данных - MyDatabase.
Стол называется [dbo]. [Ленивец]
Настройки 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, и все заработало.