PHP MSSQL: Problemi con la gestione delle date

Indipendentemente dal linguaggio di programmazione e strumenti utilizzati, quando si lavora con dati provenienti da data base (Microsoft SQL Server, Oracle, PostgreSQL, etc...) è facile imbattersi in una serie di problemi, uno tra i più rognosi sono i dati di tipo data, basti pensare alle problematiche che possono sorgere quando si devono trattare le date tenendo conto dei fusi e formati.

L'oggetto dell'articolo sarà PHP in coppia con MSSQL, nel breve articolo vedremo quindi come risolvere un problema legato alla gestione dei dati di tipo data generato da una cattiva configurazione del driver. La piattaforma di riferimento è GNU/Linux & PHP 5.2, Apache non è obbligatorio per quel che serve dimostrare.

Per dar la possibilità di accedere a data base Microsoft SQL Server (nel caso preso in esame si tratta della versione 2005) al software scritto in PHP è necessario che il modulo MSSQL sia installato e attivo, per verificar ciò basta eseguire il seguente comando:

php -m|grep mssql

La presenza del modulo MSSQL presuppone che sia correttamente installato il componente software FreeTDS, si tratta di un driver Open Source che implementa il protocollo TDS (Tabular Data Stream) utilizzato da SQL Server e necessario per il corretto funzionamento del modulo MSSQL di PHP.

La configurazione standard di FreeTDS per quel che riguarda le impostazioni di localizzazione, prevede che per i dati di tipo data sia applicato il formato: %b %e %Y %I:%M:%S:%z%p che si traduce in una data del tipo: Sep 25 2009 11:37:15:+0200AM. Dal lato applicativo è senza dubbio più comodo lavorare con date che siano restituite in formato ISO 8601 (http://www.iso.org/iso/support/faqs/faqs_widely_used_standards/widely_used_standards_other/date_and_time_format.htm, http://it.wikipedia.org/wiki/ISO_8601), come per esempio potrebbe essere una data del tipo: 2009-09-25. Per maggiori informazioni su come impostare il formato data fare riferimento alla documentazione della funzione C strftime(), sotto GNU/Linux basta il comando:

man 3 strftime

Le impostazioni di localizzazione di FreeTDS risiedono sul file di configurazione $FREETDS/locales.conf, dove FREETDS è la variabile di ambiente che indicata il path d'installazione di FreeTDS. Il file è suddiviso in sezioni ed ogni sezione contiene i settings di localizzazione.

[default]
date format = %b %e %Y %I:%M:%S:%z%p
[en_US]
date format = %b %e %Y %I:%M:%S:%z%p
language = us_english
charset = iso_1

La sezione è identificata dal language, FreeTDS per scegliere quali impostazioni di localizzazione applicare si rifà al valore della variabile di ambiente LANG, qualora il valore di LANG non trova riscontro in nessuna sezione allora FreeTDS applica le impostazioni di localizzazione di default.

tsql_Example

Ipotizzando di avare un LANG impostato a en_US, potremmo cambiare il date format dall'attuale formato (%b %e %Y %I:%M:%S:%z%p) al formato desiderato, ovvero quello ISO 8601: %Y-%m-%d %H:%M:%S , per far una prova che il tutto funzioni a dovere, è possibile eseguire una query utilizzando il tool tsql fornito con FreeTDS.

In Figura ho evidenziato come le date sono restituite nel formato desiderato, ho inoltre evidenziato le impostazioni del locale che FreeTDS segue sulla base della variabile d'ambiente LANG.

Sul vostro codice PHP non resta che utilizzare le funzioni di trattamento delle date in modo più agevole, eccovi un esempio:

<?php
$datetime = new DateTime('2009-09-01 10:23');
echo $datetime->format('d/m/Y') . "n";
?>

Il codice PHP illustrato formatta la data ricevuta dal data base nel formato desiderato, in questo caso quello italiano. Non sarebbe stato possibile utilizzare il codice sopra qualora la data fosse stata restituita nel formato di default. Il codice PHP illustrato è valido solo per versione di PHP >= 5, la versione PHP 4 sarebbe:

<?php
echo date('d/m/Y', strtotime('2009-09-01 10:23'));
?>

Su questo argomento si potrebbe ancora trattare molto, basti pensare alla gestione dei fusi sulla base della localizzazione del client, questa è però un'altra storia.

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

You may also like...