我正在尝试使用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)'
我能够使用不同Web服务器上的相同代码连接到数据库,这让我相信这是一个配置问题。两台服务器上的php.ini文件看起来相对相同。它们各自具有相同的PDO库,并且配置了相同的选项。
有谁知道为什么会发生这种情况?
答案 0 :(得分:16)
事实证明这是一个比我想象的要简单得多的问题。无论出于何种原因,开发服务器没有使用端口1433作为连接中的默认端口,而是使用端口4000。
我通过启用freetds.conf文件中的日志并在我发出请求时监视它们来发现这一点。
另外,需要注意的事项:DBLIB扩展使用冒号(:)作为主机和端口之间的分隔符而不是逗号。不幸的是,使用逗号时收到的错误不是很具描述性,所以希望有人从这个发现中受益。
答案 1 :(得分:3)
直接为此主机写入 freetds.conf 端口:
[RemoteServer]
host = RemoteServer
port = 1433
离开php-code us:
$conn = new PDO('dblib:dbname=TestDB;host=RemoteServer;charset=utf8', 'my_user', 'my_pass');