无法使用 PHP 脚本连接到 SQL Server。

6

我使用 SQL Server 2016。我尝试通过 PHP 脚本(PHP 版本 8)连接它。我已经安装了驱动程序并在 php.ini 中添加了路径(与我的 PHP 版本相同):

...
extension=pdo_sqlsrv_80_nts
extension=pdo_sqlsrv_80_ts
extension=sqlsrv_80_nts
extension=sqlsrv_80_ts
...

这是我的脚本:

$serverName = "<ServerName>";
$connectionInfo = array( "Database"=>"<database>", "UID"=>"<user>", "PWD"=>"<pwd>");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
     echo "Connection established.<br />";
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}

我遇到了以下错误:
Array
(
    [0] => Array
        (
            [0] => IM006
            [SQLSTATE] => IM006
            [1] => 0
            [code] => 0
            [2] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
            [message] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
        )

    [1] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5701
            [code] => 5701
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
        )

    [2] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5703
            [code] => 5703
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
        )

)

有什么想法可能出了问题吗? 谢谢你的帮助

phpinfo()

phpinfo()


你应该在连接字符串中指定驱动程序:https://www.connectionstrings.com/microsoft-odbc-driver-17-for-sql-server/ - gvee
谢谢你的帮助,但我仍然不理解。 PHP文档很清楚 https://www.php.net/manual/en/function.sqlsrv-connect.php ,对于标准连接到SQL Server 16也很简单:https://www.connectionstrings.com/sql-server-2016/Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;连接字符串需要适应PHP的字符串(UID和PWD)。 - Andreas
2
看起来你安装了sqlsrv和pdo_sqlsrv驱动程序。你尝试过使用PDO_SQLSRV示例吗? - AlwaysLearning
谢谢"AlwayLearning",有了pdo_sqlsrv它可以工作了!我最后进行了一次测试,通过注释php.ini中的pdo_sqlsrv扩展行并重试sqlsrv。我收到了相同的错误消息。我仍然不明白为什么它不能与sqlsrv一起工作,但是多亏了你,我至少有了一个解决方案。谢谢! - Andreas
@Matt,你可能是对的。通过添加实例名称,我得到以下错误:在建立与 SQL Server 的连接时发生了与网络相关或特定于实例的错误。找不到服务器或无法访问。请检查实例名称是否正确,并检查 SQL Server 是否配置为允许远程连接。有关更多信息,请参阅 SQL Server Books Online。 - Andreas
显示剩余2条评论
3个回答

8
升级 Php 7 到 8 后,我遇到了同样的问题。像这里的一些评论者提到的那样,我的 PDO 代码 (pdo_sqlsrv) 仍然有效。但是旧的非-PDO 代码 (sqlsrv) 出现了您描述的同样错误。 我开始将该代码切换到 PDO,并在有机会时继续进行。但是我随后意识到更新 SQL Server 驱动程序解决了该问题。您可以通过谷歌搜索“Download ODBC Driver for SQL Server”来找到这些驱动程序。您将需要版本 17 或更高版本。

3
更新ODBC驱动程序也帮助了我,谢谢! - Kamil
1
更新ODBC驱动程序对我也起了作用。我之前使用的是17.4.1版本,升级到17.8.1版本后解决了我的问题。https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver15 - Jeff

6

我最近遇到了同样的问题。对我来说,sqlsrv_query会将警告视为错误而抛出异常。我通过在查询代码上方添加sqlsrv_configure('WarningsReturnAsErrors',0); 解决了这个问题。

更新: 你需要更新你的ODBC驱动版本。根据这篇文章,低于17.4.2版本的驱动存在已知的问题。 从这里下载最新的ODBC驱动。

更新2: 如果你正在使用PHP驱动程序5.9,则ODBC驱动程序18将不兼容。参考这里。同时你需要拥有高于17.4.2版本的ODBC驱动程序17。


1
谢谢,那也帮了我大忙 :-) - Klaus

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接