所以我使用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"
在terminal它返回
PDO drivers => dblib, mysql
所以就我所知,所有的configuration和驱动程序安装都是应该的。
所以现在的错误:
错误1
如果我像这样初始化PDO:
$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
它连接,但如果我删除“=”字符的数据库名称,如下所示:
$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数据库pipe理门户中,它将返回所有正确的行。
任何有关这些问题的帮助将不胜感激!
编辑
通过一些testing,我发现这两个问题源于PDO没有连接到数据库,而是连接到“主”。 这将解释错误2的无效对象名称错误。
任何想法为什么错误1中的代码不连接到MyDatabase?
解
我使用PHP 5.3.10,它仍然存在以下错误, https: //bugs.php.net/bug.php?id =64338
原来,PDO驱动程序正在制作Microsoft Azure SQL数据库不喜欢的USE语句。
我升级到PHP 5.4.21,一切正常。