使用PHP、ODBC和Windows身份验证连接到SQL Server

11

我正在尝试使用PHP通过Windows身份验证连接ODBC数据源。我可以在SQL Server中成功连接服务器,所以我知道它正在运行。当我尝试运行命令时

$link = odbc_connect("my_odbc","",""); 

我遇到了如下错误:

  

"警告:odbc_connect():SQL 错误:
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]
Login failed for user ''。, SQL state 28000 in SQLConnect in C:\Users..."

我尝试了:

$link = odbc_connect("Driver={ODBC Driver 11 for SQL Server};   
        Server='my_odbc';Integrated Security=SSPI","","");

返回的信息为:

警告:odbc_connect():SQL错误:
[Microsoft][ODBC Driver 11 for SQL Server]
Named Pipes Provider:无法打开到 SQL Server [53] 的连接,SQL 状态 08001 在 C:\Users..." 中的 SQLConnect

不确定我做错了什么。

  • my_odbc 是另一台机器上运行的 SQL Server(2008)。我没有该数据库的管理员权限,因此无法更改那一端的任何内容(例如启用 SQL Server 身份验证)。

  • 我正在运行 Windows 7,并使用 PHP 版本 5.6.12。

  • phpinfo() 表明已启用 ODBC 支持以及 pdo_sqlsrv 支持。


2
连接字符串中的Integrated Security=SSPI告诉ODBC驱动程序使用当前用户来运行进程。也可以在连接字符串中指定特定的用户ID和密码。 - rdyhalt
你确定你的代码使用的身份被授予连接到 SQL Server 的权限了吗?http://blogs.msdn.com/b/brian_swan/archive/2010/02/10/sql-server-driver-for-php-understanding-windows-authentication.aspx - Rory
4
你为什么使用ODBC而不是使用SQL本机驱动程序呢?例如,使用sqlsrv_connect() - https://msdn.microsoft.com/en-us/library/cc296205%28v=sql.105%29.aspx? - Rory
错误提示为“用户登录失败”,您没有传递用户名或密码。您应该使用您的SQL Server用户名/密码进行$link = odbc_connect("my_odbc", "your_user", "your_pass");操作,不是吗? - heenenee
7个回答

3

这个错误是一般性错误,由于某些原因无法与服务器建立连接而引起。重要的是要知道您正在使用哪个PHP服务器以及与之一起使用的应用程序,例如Apache、Xampp或Wamp等。

以下是您可以尝试的一些方法:

  • 检查它是否能ping通
  • 如果未启用,请在SQL Server Configuration Manager中启用TCP/IP连接SQL Server Configuration。要这样做,请打开 SQL Server Configuration Manager -> SQL Server Network Configuration->Protocols for SQL server->TCP/IP(设置为已启用),然后重新启动SQL服务。
  • 启用服务器上的远程连接
  • 打开端口,要这样做,请进入Windows防火墙设置 ->异常情况 ->添加端口(名称:SQL;端口:1433;TCP),然后从异常情况中选中SQL并保存。
  • 启用运行浏览器服务。SQL Server Configuration Manager -> SQL Server Services - > SQL Server Browser设置为运行。
  • 在连接字符串中定义端口
  • 如果使用多个实例,请将实例名称与计算机名称一起添加

示例:

$user = 'username';
$pass = 'password';
//Use the machine name and instance if multiple instances are used
$server = 'serverName\instanceName';
//Define Port
$port='Port=1433';
$database = 'database';

$connection_string = "DRIVER={ODBC Driver 11 for SQL Server};SERVER=$server;$port;DATABASE=$database";
$conn = odbc_connect($connection_string,$user,$pass);

这里是我找到的有关问题的有用链接

解决无法打开与 SQL Server 的连接错误

SQL Server 提供程序命名管道提供程序错误

也请查看以下链接

命名管道提供程序:无法打开与 SQL Server 的连接 [53]


1
我只找到了你使用端口的示例。你在哪里找到它的? - Mbotet
1
呵呵,已经六年了,我不记得了。 - aimme

3
也许你应该尝试使用PDO(性能差距并不大),并配合SQLsrv插件(我正在使用这个插件连接到我另一个老板的软件,该软件使用SQL Server 2008数据库):
$connection = new PDO("sqlsrv:Server=" . $this->sourceServer . ";Database=" . $this->sourceDB, $this->sourceUser, $this->sourcePW);
$connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

您可以在此处下载插件

https://www.microsoft.com/en-ca/download/details.aspx?id=36434

在Xampp中,您必须将dll文件复制到该文件夹中:

C:\xampp\php\ext

你需要将那一行添加到你的php.ini文件中。

extension = php_pdo_sqlsrv_56_ts.dll

注意: 不要忘记重新启动服务器,以便它考虑新的php.ini文件。

如果您成功了,请告诉我。


2

有人遇到了相同的错误信息,并在这里提问并回答了自己。

引用如下...

对于造成的困扰我感到非常抱歉。

问题是,我使用的是SQL Server Native Client 11.0作为驱动程序。我将其切换到SQL Server后,现在它可以工作了 :/

希望这至少能帮助一些人解决类似的问题....


2
您的问题中有一个重要遗漏,即您使用哪些凭据来运行PHP。
假设您正在使用IIS或Apache(或其他Web服务器),那么您的PHP进程可能正在本地系统帐户下运行:

IIS service properties Apache service properties

由于此帐户是本地帐户,因此没有授权访问您的远程SQL Server。
您可以更改IIS / Apache服务以使用已获授权连接到SQL Server的凭据(您自己的凭据?),但请注意,这可能会导致服务的其他权限问题,并且在将来更改密码时可能会出现问题。
尝试从命令行运行测试脚本(默认情况下应该使用您的凭据运行),以确定问题所在:
php -r "var_dump(odbc_connect(...));"

0

查看注册表 HKLM/SOFTWARE/ODBC

你的文件夹名是什么?

如果有“SQL Server Native Client 11.0”,那么你需要像这样编写你的 PHP 代码

odbc_connect("Driver={SQL Server Native Client 11.0};Server=ip;Database=db;", "user", "pass");

然而,像Server 2008这样的一些服务器将记录此ODBC,如下所示:

ODBC Driver 11 for SQL Server

然后,您需要将SQL Server Native Client 11.0替换为ODBC Driver 11 for SQL Server。


0

首先,您需要创建一个ODBC接口。原则上,这应该可以在没有用户和密码的情况下工作。如果在您的接口中定义了。

$pdo = new PDO('odbc:dsnName','user','pw');

-2

在IIS上启用PHP或PDO_ODBC管理器:

我已通过Windows进行身份验证,使用以下PHP语句:

$Conn = new PDO("odbc:Driver={SQL Server};Server=JAMILI-PC\SQLEXPRESS;null;null");

我正在使用Windows 2008。

希望这能解决您的问题。


1
这看起来不像是有效的 PHP 语法? - Martin Tournoij

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