[英]Cannot connect to MS SQL Server using PDO
最近两天,我花了很多时间试图弄清楚如何从Ubuntu 14.04服务器使用PHP连接到Azure托管的MS SQL服务器。
负责启动与远程数据库的连接的代码如下:
public function connect()
{
try
{
$this->databaseConnection = new \PDO(
'dblib:host='.$this->hostname.':'.$this->port.';dbname='.$this->databaseName.';',
$this->username,
$this->password
);
$this->databaseConnection->setAttribute(
\PDO::ATTR_ERRMODE,
\PDO::ERRMODE_EXCEPTION
);
}
catch (\PDOException $e)
{
throw new \Exception('Failed to connect to the database: '.$e->getMessage());
}
}
每当我尝试连接时,我都会收到:
无法连接到数据库:SQLSTATE [01002] Adaptive Server连接失败(严重性9)
问题在于这是一个非常普遍的错误,我无法理解导致问题的原因。
这是我的/etc/freetds.conf配置:
[placeholder.database.windows.net]
host = placeholder.database.windows.net
port = 1433
tds version = 7.2
client charset = UTF-8
这是tsql -C
输出:
Compile-time settings (established with the "configure" script)
Version: freetds v0.91
freetds.conf directory: /etc/freetds
MS db-lib source compatibility: no
Sybase binary compatibility: yes
Thread safety: yes
iconv library: yes
TDS version: 4.2
iODBC: no
unixodbc: yes
SSPI "trusted" logins: no
Kerberos: yes
除此之外,我尝试使用mssql_*
函数进行一些测试,即使我能够成功连接到数据库,大多数查询也无法正常工作。
对于您的应用程序中一个sqlsrv服务器连接的简单解决方案,可以在freetds.conf
的[global]
部分下将tds
版本修改为8.0
,例如
[global]
tds version = 8.0
然后在PHP脚本中进行测试:
try {
$pdo = new PDO("dblib:host=<azure_sql_name>.database.windows.net;dbname=<dbname>", "<username>", "<password>");
} catch (PDOException $e) {
echo "Error: " . $e->getMessage() . "\n";
}
修改后,它对我而言效果很好。 如有任何其他疑问,请随时告诉我。
该问题是由2个不同的问题引起的。
第一个与错误的FreeTDS配置有关。 freetds.con全局部分需要像这样:
[global]
tds version = 8.0
第二个原因是由于在连接到Azure托管的MSSQL服务器时必须以以下方式指定用户名:
<username>@<freeTDSServerName>
freetds.conf中的特定服务器配置如下所示:
[<freeTDSServerName>]
database = <databaseName>
host = <serverName>.database.windows.net
port = 1433
tds version = 8.0
因此,PHP DB连接将如下所示:
$this->databaseConnection = new \PDO(
'dblib:host='.$this->hostname.':'.$this->port.';dbname='.$this->databaseName.';',
$this->username.'@<freeTDSName>',
$this->password
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.