2011-08-23 19 views
5

Questo è il codice standard quando si utilizza l'autenticazione di Windows:Perché è possibile connettersi a SQL Server Express locale ma non a SQL Server remoto da PHP?

<?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"; 
?> 

I lavori di cui sopra per la connessione al server locale (SQL Server 2008 Express Edition), ma non per la connessione a un server della rete (SQL Server Standard Edizione). Il messaggio di errore è:

eccezione 'PDOException' con il messaggio 'SQLSTATE [28000]: [Microsoft] [SQL Server Native Client 10.0] [SQL Server] accesso non riuscito per utente' myDomain \ Geoffrey-PC $ '' in C: \ wamp \ www \ PhpProject1 \ index.php: 10 Traccia stack: # 0 C: \ wamp \ www \ PhpProject1 \ index.php (10): PDO -> __ construct ('sqlsrv: Server = n. .. ', null, null) # 1 {main}

la stringa di connessione per il server di rete è la stessa per il server locale, se non che il nome del server è simile a abc0120 e non finisce con \ SQLEXPRESS o qualsiasi altra cosa e il nome del database è diverso. Il nome del database che uso con il server di rete esiste.

Sto usando Apache 2.2.11. La pagina di MSDN SQLServer 2005 per How to: Connect Using Windows Authentication recita:

le credenziali con cui processo del server Web (o filo) è in esecuzione devono mappare un account di accesso di SQL Server valido per poter stabilire una connessione.

Forse questo è il problema.

Posso connettermi al server di rete utilizzando SQL Server Management Studio anche utilizzando l'autenticazione di Windows.

+0

Inserire qui la stringa di connessione utilizzata per il server remoto. – Jacob

+0

@cularis, è uguale a quello per il localserver, tranne che il nome del server è qualcosa come abc0120 (e non termina con \ SQLEXPRESS) e il nome del database è diverso (e il database esiste). – systemovich

+1

Il processo PHP viene eseguito con un account noto all'istanza di SQL Server sul server remoto? In genere, Management Studio viene eseguito con il proprio account, ma il server Web no. – tdammers

risposta

2

Dal manuale di PHP, avete questo esempio:

<?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(); 
} 

Nel tuo esempio, si omette il $user e $password argomenti. Proverò a specificare un nome utente e una password anziché passare null; l'utente che esegue il tuo script PHP potrebbe non essere lo stesso dell'utente registrato ... omettendo di fornire un nome utente e una password, PHP tenta di fornire le credenziali dell'utente che sta eseguendo lo script (con forse anche nessuna password).

+0

hai ragione. Quando il programma è in produzione, lo script deve utilizzare l'autenticazione di SQL Server anziché l'autenticazione di Windows, in modo che tutti gli utenti dello script non debbano disporre delle autorizzazioni per SQL Server. – systemovich

Problemi correlati