为什么我可以从PHP连接本地SQL Server Express但无法连接远程SQL Server?

5

使用Windows身份验证时,以下是标准代码:

<?php
    try {
        $conn = new PDO("sqlsrv:Server=geoffrey-pc\SQLEXPRESS;Database=books", 
                         NULL, NULL);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo $e;
        die("Error connecting to SQL Server");
    }

    echo "Connected to SQL Server\n";
?>

以上适用于连接本地服务器(SQL Server 2008 Express Edition),但不适用于连接网络上的服务器(SQL Server Standard Edition)。错误信息如下:
exception 'PDOException' with message 'SQLSTATE[28000]: [Microsoft][SQL Server Native Client 10.0][SQL Server]Login failed for user 'myDomain\GEOFFREY-PC$'.' in C:\wamp\www\PhpProject1\index.php:10 Stack trace: #0 C:\wamp\www\PhpProject1\index.php(10): PDO->__construct('sqlsrv:Server=n...', NULL, NULL) #1 {main}
与本地服务器连接字符串相同,只是服务器名称类似于abc0120而不以\SQLEXPRESS或其他任何内容结尾,并且数据库名称不同。我使用网络服务器的数据库名称确实存在。
我正在使用Apache 2.2.11。针对如何使用Windows身份验证进行连接的SQL Server 2005 MSDN页面中写道:
Web服务器进程(或线程)运行的凭据必须映射到有效的SQL Server登录才能建立连接。
也许这就是问题所在。
我也可以使用Windows身份验证连接到网络服务器,使用SQL Server Management Studio。

将您用于远程服务器的连接字符串放在这里。 - Jacob
@cularis,它与本地服务器的相同,只是服务器名称类似于abc0120(不以\SQLEXPRESS结尾),数据库名称也不同(且数据库确实存在)。 - Geoffrey
1
PHP进程在远程服务器上运行的SQL Server实例下是否是已知帐户?通常,Management Studio 在您自己的帐户下运行,但 Web 服务器没有。 - tdammers
远程 SQL Server 是否启用了 TCP?默认情况下,针对 MSSQL 2005 的网络连接是被禁用的。链接 - Gavin
在catch块中,你可以使用echo语句输出$e->getMessage(),看看实际的错误是什么? - Gavin
显示剩余6条评论
1个回答

2

从PHP手册中,您可以看到以下示例:

<?php
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

在您的示例中,您省略了$user$password参数。我建议指定用户名和密码而不是传递null;运行您的PHP脚本的用户可能与登录用户不同... 如果没有提供用户名和密码,PHP会尝试提供运行脚本的用户的凭据(甚至可能没有密码)。

你是正确的。当程序处于生产状态时,脚本应该使用 SQL Server 身份验证而不是 Windows 身份验证,这样脚本的所有用户都不需要在 SQL Server 上拥有权限。 - Geoffrey

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