【问题标题】:Connecting to SQL Server using PHP, ODBC, and Windows authentication使用 PHP、ODBC 和 Windows 身份验证连接到 SQL Server
【发布时间】:2015-11-11 17:50:38
【问题描述】:

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

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

我得到错误:

“警告:odbc_connect():SQL 错误:
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]
用户 '' 登录失败。,C 中 SQLConnect 中的 SQL 状态 28000: \用户...”

我试过了:

$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]
命名管道提供程序:无法打开与 SQL Server 的连接 [53]。 , SQLConnect 中的 SQL 状态 08001 在 C:\Users..."

不知道我做错了什么。

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

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

  • phpinfo() 表示启用了 ODBC 支持以及pdo_sqlsrv 支持

【问题讨论】:

  • 连接字符串中的 Integrated Security=SSPI 告诉 ODBC 驱动程序将当前用户用于正在运行的进程。可能是连接字符串中的特定用户 ID 和密码。
  • 您确定您的代码使用的身份被授予连接到 SQL Server 的权限吗? blogs.msdn.com/b/brian_swan/archive/2010/02/10/…
  • 为什么使用 ODBC 而不是使用 SQL Native 驱动程序?例如使用 sqlsrv_connect() - msdn.microsoft.com/en-us/library/…
  • 错误提示“用户登录失败”并且您没有传递用户名或密码。你不应该用你的 SQL Server 用户名/密码做$link = odbc_connect("my_odbc", "your_user", "your_pass"); 吗?

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


【解决方案1】:

也许你应该尝试使用 SQLsrv 插件(这是我用来连接我其他老板的使用 SQL Server 2008 数据库的软件)的 PDO(性能差异不是那么大):

$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】:

    有人有同样的错误信息,并提出并回答了他自己的问题here

    引用...

    很抱歉给您带来麻烦。

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

    希望这至少可以帮助遇到类似问题的人....

    【讨论】:

      【解决方案3】:

      您的问题中一个重要的遗漏是您如何运行 PHP 以及使用哪些凭据。

      假设您使用的是 IIS 或 Apache(或其他 Web 服务器),那么您的 PHP 进程可能正在本地系统帐户下运行:

      由于此帐户是本地,它没有任何权限访问您的远程 SQL Server。

      您可以更改 IIS/Apache 服务以使用授权连接到 SQL Server 的凭据(您的?)运行,但请注意,这可能会导致服务出现其他权限问题,并且如果您进行更改,也会出现问题您以后的密码。

      尝试从命令行运行测试脚本(默认情况下应使用您的凭据运行)以确定问题出在哪里:

      php -r "var_dump(odbc_connect(...));"
      

      【讨论】:

        【解决方案4】:

        此错误是由于某些原因无法建立与服务器的连接而出现的一般错误。了解您使用 PHP 的服务器以及使用它的应用程序非常重要。例如 Apache、Xampp 或 Wamp 等。

        这里有一些你可以尝试的东西。

        简单介绍一下,下面是参考链接。

        • 检查是否ping通
        • 如果未启用,则启用 TCP/IP 连接 SQL Server 配置。为此,请打开 SQL Server Configuration Manager -> SQL Server Network Configuration->Protocols for SQL server->TCP/IP(set to enabled)。 重新启动 SQL 服务。
        • 从服务器启用远程连接
        • 打开端口,Windows Firewall Settings-> Exceptions -> add a Port (Name:SQL;Port:1433;TCP) then from Exceptions tick 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);
        

        这里是我发现的有关该问题的有用链接

        resolving could not open a connection to sql server-errors

        sql server provider named pipes provider error

        也看看这些链接

        Named Pipes Provider: Could not open a connection to SQL Server [53]

        【讨论】:

        • 我只找到了您使用端口的示例。你在哪里找到的?
        • 呵呵。已经六年了。我不记得了。
        【解决方案5】:

        查看注册表 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 替换为 SQL Server 的 ODBC Driver 11。

        【讨论】:

          【解决方案6】:

          在管理器 PHP o PDO_ODBC 上的 IIS 中启用:

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

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

          我使用的是 Windows 2008。

          希望它能解决你的问题。

          【讨论】:

          • 这看起来不像是有效的 PHP 语法?
          猜你喜欢
          • 2014-07-15
          • 2013-09-07
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多