使用集成身份验证连接到 PHP 中的 MSSQL 服务器

Connecting to MSSQL server in PHP using integrated authentication

我在 MS Server 2012 R2 上安装了 XAMPP 运行ning。我需要连接到仅接受集成 win 身份验证的 MSSQL 服务器。
如果我只是尝试下面的操作,我会在 SQL 服务器上收到登录失败和错误日志,表明 SQL 身份验证不是一个选项。它只接受来自特定用户的连接。显然 PHP 脚本不在该帐户下 运行。

$server = "sqlServerName";
$SQLUser = "username";
$SQLPass = "pw";
$SQLDatabase = "db";
$link = mssql_connect($server,$SQLUser,$SQLPass);

因为我正在使用 PHP 5.3.1 sqlsrv_connect 不是一个选项。我试图为它加载 php 驱动程序,但它就是不工作。我无法更改 sql 服务器的身份验证,也无法使用任何其他版本的 PHP.

我也无法打开 secure_connection,因为我必须能够连接到需要 "normal" sql 身份验证的其他 sql 服务器:

mssql.secure_connection = Off

如何连接到有问题的 sql 服务器?

UPDATE: 升级xampp到最新版本。 PHP 现在是版本 5.6.8 我仍然无法使用 sqlsrv_connect() 即使我安装了必要的驱动程序并将每个 dll 添加到 php.ini。重新启动 apache 几次。有什么线索吗?

error msg: Fatal error: Call to undefined function sqlsrv_connect()

好的。不在服务器上很难调试服务器问题,但我在 php 和 SQL 服务器上做了很多工作,所以我会尽力分享我的经验。

首先,很高兴您从 5.3.1 更新了 php 版本太旧且非常不安全。以下是对您的系统的一些健全性检查。这可能对您没有任何帮助,但所有这些都值得检查。

  1. 首先确保您可以使用 SQL Server Management studio 和您提供的凭据连接到 sql 服务器。这意味着您在 php 中使用的凭据与 windows 身份验证凭据相同。您应该能够同时拥有两个连接,这样您就可以同时进行更改和测试连接。

    1. 启用 TCP。 sql 服务器配置管理器 -> SQL 服务器网络配置 -> sqlexpress 的协议 -> tcp/ip(右键单击)-> 属性 -> 已启用(是) -> ip 地址 -> IPAll -> TCP 端口 1433 -> ok
    2. 启用sql 服务器验证。 Select 服务器(右键单击)-> 属性 -> 安全 -> sql 服务器和 windows 身份验证模式 -> 确定
    3. 在防火墙上打开 sql 服务器端口。 Windows 控制面板 -> 系统和安全 -> windows 防火墙 -> 高级设置 -> 入站规则 -> 新规则 -> 端口 -> tcp -> 1433(或其他) -> 允许连接 - > 下一步 -> 名称 -> sql 服务器 -> 完成 -> 重新启动计算机。
    4. 当然,如果您想通过非默认用户连接,您需要添加用户:sql 服务器 -> 安全 -> 登录(右键单击)-> 添加登录 -> 服务器角色 - > 系统管理员 -> 确定
    5. 如果您进行了任何这些更改,请重新启动 sql 服务器:Sql 服务器配置管理器 -> sql 服务器服务 -> sql 服务器(右键单击)- > 重启。
  2. 一旦您确认可以连接管理工作室,这里是 php 配置检查:

    1. 您可以通过创建一个仅包含 phpinfo() 函数的 php 页面来查看扩展本身是否可用。然后搜索pdo_sqlsrv。如果它存在,其余这些检查可能就没有必要了,但既然你已经工作了这么久,可能还是要检查一下。
    2. sql_srv php 的扩展应该是 php 的 3.2 版 5.6 你可以获得那个库 here
    3. 版本 3.2 需要 os 可用的扩展 here 检查上一个 link 的其他要求。您的 os 可能使用与此处 link 不同的扩展名。
    4. 找到您的 php 扩展目录。这通常是 {php-install-directory}/ext。确保将下载的 sqlsrv 库的适当版本复制到此目录中。我的叫 "php_sqlsrv_55_ts.dll" 和 "php_dpo_sqlsrv_55_ts.dll" 你的叫 56 而不是我认为的 55 并且 "ts" 应该匹配你的 php 安装。 "ts"表示线程安全,另一个选项是"nts"不是线程安全的。您使用的那个取决于您的 php 安装。
    5. 我的 php.ini 文件按顺序包含 extension=php_sqlsrv_55_ts.dllextension=php_pdo_sqlsrv_55_ts.dll 这些行。但我认为顺序并不重要。你的又是 56 而 "ts" 可能是 "nts".
    6. 如果您根据这些进行了任何更改,请确保重新启动 apache,然后检查 pdo_sqlsrv 是否在您的 phpinfo() 报告中。同样在重新启动 apache 后检查 apache 和 php 错误日志,看看您是否收到有关 php 尝试加载扩展的特定错误。 Post those 如果你需要帮助他们。
  3. 一旦您通过 management studio 中的 auth creditionals 连接到 sql 服务器并在您的 phpinfo() 中看到 pdo_sqlsrv 这是最后的事情查看您的代码。

    1. 您上面的代码仍然适用于 mssql 扩展。您可能只是没有用最新的更改更新它。对于 sql 服务器扩展,您的代码应如下所示:

      $connectionInfo = array( 'UID' => $dbuser, 'PWD' => $dbpass, 'LoginTimeout' => 1, ); $host = $host . ', ' . $port; $connection = sqlsrv_connect($host, $connectionInfo); $error_messages = sqlsrv_errors();

    2. 对于 windows 身份验证排除 uid 和 pwd。

      $connectionInfo = array(); $conn = sqlsrv_connect( $host, $connectionInfo);

如果您有更多问题,请告诉我哪个步骤不起作用,以便我们深入了解该步骤的更多细节。

返回 mssqlconnect() 工作的 PHP 5.3.1 堆栈。 SQL 服务器集成模式需要经过身份验证的用户,该用户可以访问计算机 运行ning SQL 服务器。因此,如果您可以在 SSMS 中与您的用户连接,则需要使用您的用户凭据启动 XAMPP、Apache/httpd。如果 apache 运行ning 作为服务,请转到服务面板(运行 上的 services.msc),然后转到 Apache->properties->logon->'This Account' 并放置在您的用户名和密码中,以便 apache 服务 运行s 使用您的凭据,该凭据经过身份验证可以连接到 SQL 服务器实例。默认情况下,httpd 是 运行 系统帐户,显然没有通过远程计算机上的 SQL 服务器的身份验证,让您头疼。