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

时间:2011-08-23 11:11:20

标签: php sql-server-2008 pdo sql-server-express

这是使用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)。错误消息是:

  带有消息'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-&gt; __ construct('sqlsrv:Server = n ...',NULL,NULL)#1 {main}

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

我正在使用Apache 2.2.11。 How to: Connect Using Windows Authentication的SQLServer 2005 MSDN页面读取:

  

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

也许这就是问题。

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

1 个答案:

答案 0 :(得分: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尝试提供运行脚本的用户凭据(甚至可能没有密码)在所有)。