我正在尝试连接到在Windows服务器上运行的SQL Server数据库。我在linux服务器上运行这个PHP代码(centos 7)。
我使用以下pdo连接字符串连接到数据库。
$db = new PDO ("dblib:192.168.2.1;dbname=TestDB","username",'pass');
当我运行代码时,我得到以下异常。 ' PDOException' with message' SQLSTATE [HY000]无法连接:Adaptive Server不可用或不存在(严重级9)'
我尝试使用tsql测试连接,并且我能够连接到数据库而没有任何错误。下面的代码给了我一个TestDB中所有表的列表。如果我首先使用TestDB类型,它将无法工作。
tsql -S 192.168.2.1 -U username -P 'pass' -L TestDB
use TestDB
GO
select * FROM sys.Tables
GO
我的freetds.conf文件包含以下内容
[Server1]
host = 192.168.2.1
port = 1433
tds version = 8.0
我无法弄清楚我是如何使用tsql连接的,但是在连接php时无法做到这一点。
绝对安装了dblib驱动程序。
print_r(PDO::getAvailableDrivers());
Array ( [0] => dblib [1] => mysql [2] => sqlite )
答案
找到问题的原因。原来是SELinux。以下命令解决了该问题。
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
答案 0 :(得分:3)
您拥有数据源名称,您应该使用它:
$db = new PDO ("dblib:host=Server1;dbname=TestDB","username",'pass');
你正在运行linux吗?我建议给odbc一个镜头。
答案 1 :(得分:0)
要检查的三件事。
首先使用您定义的端口尝试连接。
而不是:
$db = new PDO ("dblib:192.168.2.1;dbname=TestDB","username",'pass');
尝试使用:
$db = new PDO("dblib:host=192.168.2.1:1433;dbname=TestDB","username",'pass');
第二次,您应该确定您的SQL Server是否配置为侦听端口1433.您可以使用SQL Server配置管理器进行检查。
第三个(如果你在Windows上运行它)你可以检查的东西是我在PHP docs找到的一件事。在评论中,另一个提到了同样的错误。这个答案似乎有效:
对于PDO MSSQL连接问题,请确保您拥有ntwdblib.dll的更新版本(截至此帖子目前为8.00.194)。覆盖现有(旧)文件或将其放在Windows system32文件夹中。 PHP 5.2.X附带的版本不起作用。这显然是一个众所周知的问题,但在我能够锁定文件名之前,我很难找到有关此问题的信息。我希望这有助于某人。
另一个可能的问题可能是SELinux,如果它已启用。我在Ruby on Rails安装上遇到了一些熟悉的错误。您可以通过禁用SELinux尝试再试一次。
答案 2 :(得分:0)
使用PDO连接时,如果省略host=
,它会使用可能导致问题的Unix域套接字。放入host=
将通过TCP / IP连接到数据库。
因此,请尝试将您的代码行更改为:
$db = new PDO ("dblib:host=192.168.2.1;dbname=TestDB","username",'pass');
或者使用端口:
$db = new PDO ("dblib:host=192.168.2.1:1433;dbname=TestDB","username",'pass');
答案 3 :(得分:0)
对我来说,问题出在使用IP地址。 我将其更改为“ MyServerName / SQL2017DEV”并已连接
答案 4 :(得分:-2)
我已经看到了同样的问题。我很简单地解决了这个问题。 打开MSSQLsrver 1433端口 然后你可以连接数据库成功。