il mio blog personale: foto, video…


Sto caricando i dati ...
Failed to load data!

140 Mysql, charset e connessioni…

inserito da ligio il 6 Novembre 2007 alle 19:21
nella categoria informatica, sezione ,

Oggi mi sono imbattuto nel problema dei charset…
In pratica, in una pagina html dove vine dichiarato come content-type charset=iso-8859-1 ( <meta http-equiv=”content-type” content=”text/html; charset=iso-8859-1″ /> ) tentavo di visualizzare dei dati estratti da una tabella mysql dichiarata come UTF-8.

La pagina html presentava una serie di caratteri strani proprio dove dovevano comparire i caratteri accentati ( è ì ò … )

E così, dopo diverse ricerche, ho trovato una soluzione differente dall’utilizzare la funzione php iconv… Ovvero dichiarare i charset mysql subito dopo la connessione in questo modo:

$query = "SET character_set_results = 'latin1'";
mysql_query($query);

$query = "SET character_set_client = 'utf8'";
mysql_query($query);

Quindi, per semplificare, character_set_results = latin1 indica il fatto che la pagina è visualizzata con il content-type ISO-8859-1, mentre character_set_client = utf8 indica che le tabelle mysql che vengono prese in considerazione sono dichiarate come UTF-8

Se avessi usato semplicemente la query ” SET NAMES ‘latin1′ “, in fase di inserimento dei dati con questa connessione mysql, nelle tabelle utf-8 i caratteri accentati si sarebbero purtroppo persi!

Un’altra interessante scoperta di oggi riguarda la funzione php mysql_connect.
Questa funzione PHP accetta un quarto parametro [bool $new_link].
Nella spiegazione di questo parametro si legge…

If a second call is made to mysql_connect() with the same arguments (HOST, USER e PWD), no new link will be established, but instead, the link identifier of the already opened link will be returned. The new_link parameter modifies this behavior and makes mysql_connect() always open a new link, even if mysql_connect() was called before with the same parameters. In SQL safe mode, this parameter is ignored.

In pratica, pur utilizzando metodi come getInstance() e variabili statiche, due chiamate a mysql_connect con identico HOST, USER e PWD riportano SEMPRE il link ad un’unica connessione!
Unico modo per forzare la nuova connessione è settare il parametro $new_link a TRUE.
Per prevenire il moltiplicarsi delle connessioni, bisogna dunque eseguire dei controlli come quelli introdotti con le variabili statiche e i metodi getInstance().