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.

0 Condivisioni

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.

Potrebbero interessarti anche...

Cos'è il progetto CIE/CNS Apache Docker - Developers Italia

In questo video https://youtu.be/TcAzn1POhsM introdurrò il progetto CIE/CNS Apache Docker di Developers Italia (https://developers.italia.it/it/cie/#resourcecontent-3) nato circa due anni fa.

L'obiettivo di questo progetto è quello di fornire un template pronto all'uso che realizza un sistema di autenticazione tramite la Smart Card TS-CNS (o CNS) e la CIE (Carta d'Identità Elettronica) basato su Apache HTTP. Ognuno può poi modificare o specializzare questo progetto sulla base delle proprie esigenze Si tratta di un progetto docker per la creazione di un container che implementa un sistema di mutua autenticazione o autenticazione bilaterale SSL/TLS.

Questo meccanismo di autenticazione richiede anche il certificato digitale da parte del client, certificato che in questo caso risiede all'interno della TS-CNS o della CIE. La particolarità del sistema implementato (attraverso questo container) è quella di consentire l'autenticazione tramite:

  • La TS-CNS (Tessera Sanitaria - Carta Nazionale Servizi), rilasciata dalla regione di appartenenza;
  • La CIE (Carta d'Identità Elettronica), rilasciata dal comune di residenza.

Nella versione 2.0.0 il progetto è stato aggiornato per essere uniforme alle linee guida di Bootstrap Italia. A seguire alcune risorse che possono essere utili.

  • Cos’è il progetto CIE/CNS Apache Docker (http://bit.ly/3aJ5Gbl)
  • CIE Carta d'Identità Elettronica (https://developers.italia.it/it/cie/)
  • Carta Nazionale dei Servizi (https://www.agid.gov.it/it/piattaforme/carta-nazionale-servizi)
  • Raspberry Pi – Un esempio di applicazione della TS-CNS (https://bit.ly/3hkJ8Aj)
  • Pubblicare il servizio CIE/CNS Apache Docker su Azure Cloud (http://bit.ly/3aPoq8V)
  • Come accedere al portale VETINFO tramite TS-CNS e Mac OS (http://bit.ly/2VFMKq7)