PHP 5.3 non riconosce Native Client per connettersi a MS SQL

Abbiamo un server in esecuzione

Windows Server 2003 a 32 bit IIS6.0 (Abbiamo alcune app classiche ASP che utilizzano componenti a 32 bit per cui non è ansible eseguire l'aggiornamento a 64 bit 2008)

Il nostro server DB si trova su un computer separato con Windows Server 2008 64 bit MS SQL 2008 R2 a 64 bit

Ho installato la seguente versione di PHP 5.3.10 Build Date 2 febbraio 2012 20:26:31 Compiler MSVC9 (Visual C ++ 2008)

PHP funziona bene su pagine statiche, ma il problema è quando si tenta di connettersi a MSSQL. Abbiamo bisogno di connettersi a MSSQL a causa di un sacco di codice legacy in ASP e un DB MSSQL esistente.

Ho installato SQL Native Client 2008, l'ho installato più di una volta. Ho controllato e le DLL sono nella cartella system32.

Queste sono le estensioni che sto caricando

[PHP_SQLSRV_53_NTS_VC9] extension=php_sqlsrv_53_nts_vc9.dll [PHP_PDO_SQLSRV_53_NTS_VC9] extension=php_pdo_sqlsrv_53_nts_vc9.dll 

Quando eseguo un phpinfo non riesco a vedere il driver sqlsrv nell'elenco

Ho controllato il log degli errori di PHP e ho il seguente errore

 [22-Mar-2012 14:04:27 UTC] PHP Warning: PHP Startup: sqlsrv: Unable to initialize module Module compiled with build ID=API20090626,NTS,VC9 PHP compiled with build ID=API20090626,TS,VC9 These options need to match in Unknown on line 0 [22-Mar-2012 14:04:27 UTC] PHP Warning: PHP Startup: pdo_sqlsrv: Unable to initialize module Module compiled with build ID=API20090626,NTS,VC9 PHP compiled with build ID=API20090626,TS,VC9 These options need to match in Unknown on line 0 

Se cambio l'estensione per usare Threaded Safe e riciclare il pool di applicazioni, ottengo ancora questo errore.

Ho provato a reinstallare Native Client e PHP alcune volte ora, ma senza fortuna.

Stavo ottenendo un errore diverso prima che sqlsrv non potesse riconoscere il client nativo, ma ora php non riconosce sqlsrv.

AGGIORNARE

Sono riuscito a farlo con il driver sqlsrv corretto e senza errori sul log degli errori php

Ma quando si utilizza questo script per connettersi o darmi errore a SQL

 <?php $serverName = 'DBSERVER'; $connParams = arrays('UID'=>'UID', 'PWD'=>'PASSWORD', 'Database'=>'DATABASENAME','ReturnDatesAsStrings'=> true); $conn = sqlsrv_connect($serverName, $connParams); if(!$conn){ $errors = sqlsrv_errors(); die(var_dump($errors)); } sqlsrv_connect($conn); die('connected'); ?> 

E sto ricevendo questo errore

 > arrays(2) { [0]=> arrays(6) { [0]=> string(5) "IMSSP" ["SQLSTATE"]=> > string(5) "IMSSP" [1]=> int(-49) ["code"]=> int(-49) [2]=> string(390) > "This extension requires either the Microsoft SQL Server 2008 Native > Client (SP1 or later) or the Microsoft SQL Server 2008 R2 Native > Client ODBC Driver to communicate with SQL Server. Neither of those > ODBC Drivers are currently installed. Access the following URL to > download the Microsoft SQL Server 2008 R2 Native Client ODBC driver > for x86: http://go.microsoft.com/fwlink/?LinkId=163712" ["message"]=> > string(390) "This extension requires either the Microsoft SQL Server > 2008 Native Client (SP1 or later) or the Microsoft SQL Server 2008 R2 > Native Client ODBC Driver to communicate with SQL Server. Neither of > those ODBC Drivers are currently installed. Access the following URL > to download the Microsoft SQL Server 2008 R2 Native Client ODBC driver > for x86: http://go.microsoft.com/fwlink/?LinkId=163712" } [1]=> > arrays(6) { [0]=> string(5) "IM002" ["SQLSTATE"]=> string(5) "IM002" > [1]=> int(0) ["code"]=> int(0) [2]=> string(91) "[Microsoft][ODBC > Driver Manager] Data source name not found and no default driver > specified" ["message"]=> string(91) "[Microsoft][ODBC Driver Manager] > Data source name not found and no default driver specified" } } 

AGGIORNAMENTO 2

Ho installato gli strumenti SQLCMD e si connette correttamente al server.

Le versioni DLL sono

SQLNCLI10.DLL 2009.100.1600.1

SQLSRV32.DLL 2000.85.1117.0 (Ho aggiornato questo con la DLL da un altro server ma ancora non ha aiutato) Ora è la versione 6.1.7600.16385

Come detto sopra, è installato Native Client 2008 R2 (le DLL sono in windows \ system32) e il DB è attivo e funzionante. Se eseguo lo stesso script da un altro server, funziona.

Ho provato con permessi diversi sul pool di applicazioni, le DLL native del client e la cartella di estensione php senza fortuna.

Qualunque idea sarebbe apprezzata.

AGGIORNAMENTO 3

Come si è scoperto era un problema di authorization!

Ho scaricato Process Monitor e ho seguito le istruzioni su questo post

http://www.iislogs.com/articles/processmonitorw3wp/

Poi ho visto il process con cui w3wp.exe ha avuto accesso negato su questa chiave di registro

HKLM \ Software \ ODBC \ ODBCINST.INI \ SQL Native Client 10.0

Ho aperto RegEdit e sono andato a quella chiave.

Ho fatto clic destro -> Autorizzazioni e aggiunto il servizio di networking all'elenco e gli ho dato permessi di lettura.

Riciclato il pool di app e ora funziona!

Saluti, Fede

Si è rivelato un problema di authorization.

Ho modificato in php.ini l'opzione fastcgi.impersonate su 0 e provo con diverse identity framework; del pool di applicazioni. Ha funzionato come sistema locale. Questo è un account con più diritti utente rispetto al Servizio di networking o all'account Servizio locale. Tuttavia, tenere presente che l'esecuzione di un pool di applicazioni con un account con diritti utente maggiori comport un elevato rischio di sicurezza. Per ulteriori riferimenti sugli account e su come configurare dai un'occhiata a questo articolo:

Configurazione dell'identity framework; del pool di applicazioni con IIS 6.0 (IIS 6.0) Account utente del servizio Sicurezza del servizio e diritti di accesso

Ho deciso di reimpostarlo su Servizio di networking e scaricato Process Monitor *. L'ho poi utilizzato per monitorare il process w3wp, che mi ha mostrato che si trattava dell'accesso negato su una chiave di registro in cui è archiviato il path di sqlncli.dll.

HKLM \ Software \ ODBC \ ODBCINST.INI \ SQL Native Client 10.0

Così ho aperto RegEdit e ho trovato quella chiave

Ho fatto clic destro -> Autorizzazioni e aggiunto il servizio di networking all'elenco e gli ho dato permessi di lettura.

Riciclato il pool di app e ora funziona!

Spero che questo ti aiuti! Federico

* C'è un ottimo articolo passo dopo passo su come utilizzare il monitor di process qui.

http://www.iislogs.com/articles/processmonitorw3wp/

Ho avuto lo stesso numero di versione del compilatore e l'ho risolto con il driver ODBC di PHP:

 //$pdo = new PDO("sqlsrv:Server=$hostname;Database=$dbname;", $username, $password); // works with proper driver for PHP. $pdo = new PDO("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname;", $username, $password); // works with proper driver for ODBC and PHP ODBC.