为什么我可以从PHP连接到本地SQL Server Express而不是远程SQL Server?

sys*_*ich 5 php pdo sql-server-express sql-server-2008

这是使用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";
?>
Run Code Online (Sandbox Code Playgroud)

以上工作用于连接到本地服务器(SQL Server 2008 Express Edition),但不适用于连接到网络上的服务器(SQL Server Standard Edition).错误消息是:

消息'SQLSTATE [28000]的异常'PDOException':[Microsoft] [SQL Server Native Client 10.0] [SQL Server]用户'myDomain\GEOFFREY-PC $'登录失败.在C:\ wamp\www\PhpProject1\index.php:10堆栈跟踪:#0 C:\ wamp\www\PhpProject1\index.php(10):PDO - > __ construct('sqlsrv:Server = n ... ',NULL,NULL)#1 {main}

网络服务器的连接字符串与本地服务器的连接字符串相同,只是服务器名称类似于abc0120,并且不以\ SQLEXPRESS或其他任何内容结束,并且数据库名称不同.我与网络服务器一起使用的数据库名称确实存在.

我正在使用Apache 2.2.11.如何:使用Windows身份验证连接的SQLServer 2005 MSDN页面读取:

运行Web服务器进程(或线程)的凭据必须映射到有效的SQL Server登录名才能建立连接.

也许这就是问题所在.

我也可以使用SQL Server Management Studio使用Windows身份验证连接到网络服务器.

Yan*_*hon 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();
}
Run Code Online (Sandbox Code Playgroud)

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