【问题标题】:Connecting to MSSQL server in PHP using integrated authentication使用集成身份验证在 PHP 中连接到 MSSQL 服务器
【发布时间】:2015-06-10 14:36:38
【问题描述】:

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

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

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

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

mssql.secure_connection = Off

如何连接到我有问题的 sql server?

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

错误消息:致命错误:调用未定义函数 sqlsrv_connect()

【问题讨论】:

  • Mssql 专为 linux 发行版而设计。不知道你是如何将它安装在 Windows 机器上的(发布我希望看到的构建的链接),但我不希望它能够工作。如果需要,升级到 php 5.4 会更安全。无论如何,5.3.1 已经过时且不安全。
  • 更新问题,请查收
  • 不确定我是否理解正确。您是说,您的 SQL Server 配置为仅接受集成的 Windows 身份验证。因此,要么在有权连接到 SQL Server 的 Windows 用户下运行你的 php 脚本,要么在集成 Windows 身份验证之外启用 SQL Server 身份验证,正如@danielson317 在他的回答的第一点中所述。
  • @VladimirBaranov 启用 sql server 身份验证不是一个选项。那么如何代表用户运行 php 脚本呢?此外,如何以这种方式使用 mssql_connect(),我的意思是不提供用户/密码。因为就像我说的我不能让 sqlsrv_connect 工作。
  • @fishmong3r,在这些 docs 中,第一条评论说要在 php.ini 文件中设置 mssql.secure_connection = On 以启用 Windows 身份验证。但是你说你做不到。在这种情况下我不知道该怎么办。

标签: php sql-server-2008 windows-authentication


【解决方案1】:

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

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

  1. 首先确保您可以使用您提供的凭据使用 SQL Server Management Studio 连接到 sql server。这意味着您在 php 中使用的凭据不是 Windows 身份验证凭据。您应该能够同时拥有两个连接,以便您可以同时进行更改和测试连接。

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

    1. 您可以通过创建一个仅包含phpinfo() 函数的php 页面来查看扩展本身是否可用。然后搜索 pdo_sqlsrv。如果它存在,那么其余的这些检查可能是不必要的,但既然你已经工作了这么长时间,可能还是要检查它们。
    2. php 的 sql_srv 扩展名应该是 php 5.6 的 3.2 版,您可以获得该库 here
    3. 3.2 版需要可用的操作系统扩展here 检查上一个链接上的其他要求。您的操作系统可能使用与此处链接的扩展名不同的扩展名。
    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 尝试加载扩展的特定错误。如果您需要帮助,请在此处发布。
  3. 一旦您通过管理工作室中的 auth creditionals 连接到 sql server 并在您的 phpinfo() 中看到 pdo_sqlsrv,这是您代码中最后要查看的内容。

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

      $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);

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

【讨论】:

  • 首先感谢您的努力。因此,当我每天从其他应用程序中使用数据库时,我跳过了整个第一部分。 2.1 我没有在 php 信息中加载 pdo_sqlsrv,(2.2)虽然我已经有了驱动程序。 2.3 没听说过这个,老实说我也不知道该下载哪一个。你能帮忙吗?同样在系统要求中我看不到 Win 2012 R2,但那是我的 Web 服务器运行的操作系统。
  • 方向 2.2 链接下列出的要求发送给您:msdn.microsoft.com/en-us/library/cc296170(v=sql.105).aspx 其中声明 sqlsrv 版本 3.2 支持 2012 R2。因此,只需从 2.3 方向的链接下载软件并安装即可。然后重新启动计算机并完成这些步骤。
  • @fishmong3r 至于2.3方向的链接信息在哪里看这个截图:evernote.com/shard/s600/sh/3a7e52ec-9e87-4092-9e79-32f3555fe21c/…
  • 您的 php 错误日志中是否包含任何信息。还是你的 php 错误日志?如果扩展名包含在您的 php.ini 而不是您的 phpinfo 中,您的日志中将出现 apache 或 php 错误,解释为什么不包含它们。请查找并发布这些错误。如果您没有任何错误,则延长线本身就是错误的。
  • php error: [21-Jun-2015 10:45:08 UTC] PHP 警告:PHP 启动:无法加载动态库 'e:\xampp\php\ext\php_sqlsrv.dll' - 指定的模块无法找到。我已经在php.ini 中正确设置了扩展文件夹。正在加载所有其他扩展,没有任何问题。在某处我读到必须将 php 文件夹的路径添加到环境变量中,所以我也这样做了。 apache error日志不包含任何相关信息。
【解决方案2】:

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

【讨论】:

  • 好的,在上述之后我该如何使用mssql_connect()?它需要用户/通行证,对吗?如何设置集成身份验证/SSPI?
  • @fishmong3r 不,它没有。仅需要服务器名称的 mssql_connect($servername) 过载。您是否将 Apache 作为服务运行?
  • 是的,它作为服务运行。
  • 然后请转到服务控制台,停止服务,提供您可以访问 SQL Server 并重新启动服务的 Windows 凭据。让我知道输出。
  • php 5.3.1 有几十个安全问题。如果您打算使用 5.3,至少使用最新的安全补丁。 5.3.29 我认为。但看起来 5.3 已经到了生命的尽头。使用它显然不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多