Connettersi a Microsoft SQL Server da PHP su Linux via ODBC

Ho recentemente avuto la necessità di connettermi a un database Microsoft SQL Server presente su un host remoto attraverso un sito PHP che girava su Linux (l’ambiente di test era Ubuntu 10.10). L’applicativo PHP funzionava tramite ODBC.

Procedura aggiornata per Ubuntu 12.04

Rappresentazione grafica di MS-SQL + Linux

Ho passato diverso tempo a cercare una soluzione non catastrofica, ma nessun documento trovato su Internet è riuscito da solo a farmi arrivare a una conclusione soddisfacente. Ecco quindi come fare, aka un mix delle parti buone dei vari documenti.

Utilizzeremo il driver FreeTDS, che non è altro che un protocollo comune sia a Sybase che a MS-SQL. Tutti i pacchetti necessari sono disponibili nei repository di Ubuntu.

Per prima cosa cerchiamo e installiamo FreeTDS. I pacchetti che ci servono sono freetds-bin, freetds-dev e tdsodbc. Come seconda cosa, assicuriamoci che il server sia effettivamente raggiungibile: da terminale eseguiamo il comando “tsql -S indirizzo_server -U username” e controlliamo se abbiamo ottenuto il prompt “1>“. In caso contrario ci sono problemi di comunicazione con il server: provate a eseguire un telnet verso il server sulla porta 1433 e ricontrollate nome utente e password.

Adesso che il prompt è stato ottenuto, apriamo il file /etc/freetds/freetds.conf e aggiungiamo le seguenti linee alla fine del documento:

[TDSPROVA]
        host = <indirizzo_server>
        port = 1433
        tds version = 8.0

Salviamo, e andiamo a impostare la sorgente dati ODBC. Per farlo utilizzeremo uno strumento grafico veramente comodo e simile nella struttura a quello che troviamo in Windows: ODBCConfig. Installiamolo dal repository (il nome del pacchetto da installare è unixodbc-bin). Se per qualche motivo non potete usare ODBCConfig, più in basso ho aggiunto le istruzioni per fare tutto a mano.

Apriamo un terminale ed eseguiamo il comando “ODBCConfig” tramite superuser (sudo, su, gksu o come vi pare). Dall’interfaccia che si è aperta spostiamoci nella scheda «Drivers» e clicchiamo su «Add». Le informazioni da inserire sono le seguenti:

Name: TDSPROVA
Description: Connessione con MSSQL (descrizione libera)
Driver: /usr/local/lib/libtdsodbc.so
UsageCount: 1

Notare che il percorso della libreria può variare molto da caso a caso: se non doveste trovarla nella stessa posizione dell’esempio qua sopra, controllate in /usr/lib/odbc/. Se non c’è neanche lì, eseguite il comando “dpkg -L tdsodbc|grep libtdsodbc” per ottenere il percorso.

Quando abbiamo finito confermiamo con il segno di spunta in alto a sinistra e passiamo alla scheda «System DSN». Clicchiamo su «Add», selezioniamo il driver appena impostato e poi clicchiamo su «Ok». Questa volta inseriamo questi dati:

Name: mio_dsn
Description: Il mio dsn (descrizione libera)
Servername: TDSPROVA
Database: <nome_database>
UID: <username>
PWD: <password>

Port: 1433

Se invece lo strumento grafico appena usato ci fa schifo o non funziona, apriamo il file /etc/odbc.ini e inseriamo le seguenti righe:

[mio_dsn]
Driver      = /usr/local/lib/libtdsodbc.so
Description = Connessione con MSSQL (descrizione libera)
Trace       = No
Servername  = TDSPROVA
Database    = <nome_database>
UID         = <username>
PWD         = <password>

Port        = 1433

Ok, adesso vediamo se riusciamo a connetterci con il comando “isql -v mio_dsn <username> <password>“. Una volta ottenuto l’accesso, possiamo anche provare ad eseguire qualche query.

La procedura è terminata. Via PHP possiamo utilizzare i soliti odbc_connect (specificando il nome dsn che abbiamo scelto… nel nostro caso, “mio_dsn”), odbc_exec, eccetera (ricordandoci, se è il caso, di installare il pacchetto php5-odbc).

Risoluzione problemi

  • Se la pagina PHP, appena raggiunge un odbc_exec, non finisce più di caricare (in altre parole, se odbc_exec non restituisce mai un valore), allora è possibile che la versione che abbiamo specificato (tds version = 8.0) sia errata. Informatevi sulla versione che state utilizzando (eventualmente provate ad inserire 7.0, potreste essere fortunati).
  • Il vostro script PHP, quando chiamate odbc_exec, si lamenta perché la codifica dei caratteri non è corretta? Sorprendetelo aggiungendo la linea client charset = UTF-8 in /etc/freetds/freetds.conf, nella sezione TDSPROVA che avevamo creato (o anche in /etc/odbc.ini, nella sezione mio_dsn). Ho usato UTF-8 come esempio, ma ogni codifica che aggrada il vostro database andrà più che bene.
  • Siccome non vi funzionerà mai al primo colpo, assicuratevi di riavviare il servizio di Apache tra una bestemmia e l’altra.
  • Lo specifico per evitare dubbi: “TDSPROVA” e “mio_dsn” sono ovviamente nomi arbitrari!

Risorse utili:
http://www.linuxjournal.com/article/6636
http://www.unixodbc.org/doc/FreeTDS.html
http://www.freetds.org/userguide/freetdsconf.htm

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *