2011-08-23 111 views
5

使用Windows身份驗證時,這是標準的代碼:爲什麼我可以連接到本地SQL Server Express,但不能連接到PHP的遠程SQL Server?

<?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的版)上面的作品,而不是用於連接到服務器的網絡上(SQL Server標準版)。該錯誤信息是:

異常 'PDOException' 有消息「SQLSTATE [28000]: [微軟] [SQL Server本機客戶端10.0] [SQL服務器]登錄失敗, 用戶myDomain的\傑弗裏 - PC $ ''在C:\ wamp \ www \ PhpProject1 \ index.php中:10 堆棧跟蹤:#0 C:\ wamp \ www \ PhpProject1 \ index.php(10): PDO - > __ construct('sqlsrv:Server = n。 ..「,NULL,NULL)#1 {主}

用於網絡服務器的連接字符串相同的本地服務器,除了服務器名稱類似於abc0120,並且不與\結尾SQLEXPRESS或其他任何東西,而數據庫名稱是不同的。我用於網絡服務器的數據庫名稱確實存在。

我使用的是Apache 2.2.11。對於How to: Connect Using Windows Authentication SQLServer的2005 MSDN頁面上寫着:

下其Web服務器的進程(或線程)正在運行必須映射到一個有效的SQL Server登錄,以建立連接的憑據。

也許這就是問題所在。

我可以使用SQL Server Management Studio連接到網絡服務器,並使用Windows身份驗證。

+0

將用於遠程服務器的連接字符串放在此處。 – Jacob

+0

@cularis,除了服務器名稱與abc0120類似(並且不以\ SQLEXPRESS結尾)並且數據庫名稱不同(並且數據庫確實存在)之外,它與localserver相同。 – systemovich

+1

PHP進程是否在遠程服務器上的SQL Server實例中知道的帳戶下運行?通常情況下,Management Studio將在您自己的帳戶下運行,但Web服務器不會。 – tdammers

回答

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會嘗試提供運行腳本的用戶憑據(甚至可能根本沒有密碼)。

+0

你是對的。當程序處於生產階段時,腳本應該使用SQL Server身份驗證而不是Windows身份驗證,以便腳本的所有用戶無需擁有SQL Server的權限。 – systemovich