2012-05-23 13 views
16

Ho Apache 2.2.16 e PHP 5.4.3 su Linux Debian 6 x64.Driver ODBC nativo del server MSSQL per Linux e PHP 5.4

Per installare driver nativo ODBC del MSSQL Server per Linux, io uso le seguenti istruzioni: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/

ho configurato il mio file odbc.ini questo modo:

[mydsn] 
Driver  = SQL Server Native Client 11.0 
Database = datbase 
Server  = xxx.xxx.xxx.xxx,port 

e la mia ODBCINST.INI questo modo:

[SQL Server Native Client 11.0] 
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux 
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 
Threading=1 
UsageCount=1 

Per provare, ho eseguito il seguente comando:

$ isql -v mydsn dbusername dbpassword 

E ho avuto successo:

+---------------------------------------+ 
| Connected!       | 
|          | 
| sql-statement       | 
| help [tablename]      | 
| quit         | 
|          | 
+---------------------------------------+ 
SQL> 

Poi, un phpize utilizzato per installare unixODBC su PHP 5.4, utilizzando questo: (Il primo comando, ln -s ..., viene utilizzato perché ./ configurare non riesce a trovare le intestazioni di PHP sulla posizione predefinita)

$ sudo ln -s /usr/include/php5 /usr/include/php 
$ phpize 
$ ./configure --with-pdo-odbc=unixODBC && make && make test 
$ sudo make install 

sul mio phpinfo() ottengo:

PDO support - enabled 
PDO drivers - odbc 

PDO Driver for ODBC (unixODBC) - enabled 
ODBC Connection Pooling  - Enabled, strict matching 

Ora è il momento di provare tutto su uno script PHP 5.4:

<?php 
    ini_set('display_errors', 1); 
    error_reporting(E_ALL); 

    $conn = new PDO('odbc:DSN=mydsn;UID='.$usr.';PWD='.$psw); 

    $query = 'select * from my_table'; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(); 
    while ($row = $stmt->fetch()) { 
     echo "<pre>"; 
     print_r($row); 
     echo "</pre>"; 
    } 
?> 

Ma non funziona ... ho ricevuto questo messaggio di errore:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[01000] SQLDriverConnect: 0 
[unixODBC][Driver Manager]Can't open lib '/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0' : file not found' 
in /var/www/testemssql.php:17 
Stack trace: 
#0 /var/www/testemssql.php(17): PDO->__construct('odbc:DSN=mydsn...') 
#1 {main} thrown in /var/www/testemssql.php on line 17 

Quindi la mia domanda è: qual è accadere? Che configurazione mi manca? Come configurare correttamente il driver nativo ODBC del server MSSQL su Linux e PHP 5.4?

Ps .: Quando provo a utilizzare il file odbc_connect(), PHP dice che la funzione non esiste.

+0

Nota sicura del problema - solo cercando di offrire suggerimenti finché la persona giusta non apre la domanda. 1) Controlla i permessi su quella directory "impossibile aprire" - assicurati che apache (o www, o qualunque cosa sia PHP in esecuzione) possa leggere/aprire quella directory/file. 2) Hai provato "generico" e non "unixODBC" per PHP PDO? – Robbie

+0

scusa, cosa intendevi per "generico"? come posso testarlo? – vinigarcia87

+0

Quando hai compilato "--with-pdo-odbc = unixODBC", c'è anche una versione "--with-pdo-odbc = generic, dir, libname, ldflags, cflags" - non so se funzionerà come Non l'ho mai fatto, ma solo lanciando qualcosa a te per provare se nessun altro dà indicazioni. – Robbie

risposta

0

Non ho mai avuto la possibilità di provarlo da solo, ma ho sentito php5-sybase funziona bene, che so è disponibile sia per Debian che Ubuntu nei repository.

1

La stessa configurazione, tranne che per ODBCINST.INI:

[SQL Server Native Client 11.0] 
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux 
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0 
UsageCount=1 

Riprova dopo aver rimosso questa linea:

Threading=1 

E il tuo script php funziona bene per me.

Spero che questo possa aiutarti.

5

So che questo è un po 'tardi, ma dato che mi ha colpito questa discussione, mentre sbattere la testa contro lo stesso esatto problema qui sono alcuni suggerimenti per chiunque vi si imbattesse in futuro :-)

1) Verificare le autorizzazioni su libsqlncli-11.0.so.1790.0 per assicurarsi che qualsiasi utente Apache sia in esecuzione come può accedervi (dovrebbe avere letto ed eseguito)

2) Utilizzare ldd per verificare che nessuna delle dipendenze sia mancante - in base al fatto che isql sta funzionando sopra direi che sono OK (suggerimento: stai cercando "non trovato"):

ldd /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0

3) Prova a eseguire lo script php dalla riga di comando anziché tramite Apache. Se funziona così, vai a fermare 4. Se non lo fa, suggerirei di correre strace per vedere cosa sta facendo in realtà.

4) Questo è quello che ha fatto per me! Prova a disattivare SELinux (ovvero imposta la modalità non forzante/permissiva) e a colpire di nuovo la pagina in Apache. Non sono sicuro di cosa stia bloccando (non ho avuto il tempo o la voglia di entrare nei dettagli) ma non appena è andato tutto ha funzionato come un incantesimo. Per chiunque abbia questa inclinazione, potrei approfondire e capire come risolvere questo problema senza disabilitare completamente :-)

I comandi esatti per disabilitare SELinux possono variare in base al sistema operativo ma per me (su CentOS) ha funzionato :

http://rbgeek.wordpress.com/2012/08/06/how-to-disable-selinux-on-centos-without-rebooting/

Buona fortuna!

Problemi correlati