2012-12-26 7 views
8

Secondo php.net, StackOverflow e altre fonti di attendibilità, posso trovare 4 modi diversi per impostare UTF-8 sulla connessione PDO, ma non riesco a trovare quale sia il migliore da scegliere.Connessione PDO: dichiarazione UTF-8 con SET NAMES/CHARACTER SET?

Un PDO codice di connessione (e un po 'inits):

$localhost = $_SERVER['SERVER_NAME'] == 'localhost'; 
error_reporting(-1); ini_set('display_errors', $localhost); // Old : error_reporting($localhost ? -1 : 0); see answer above 
date_default_timezone_set('Europe/Paris'); 

$pdo_db = 'mysql:host=localhost;dbname=local_db;charset=utf8'; // METHOD #1 
$pdo_login = 'root'; 
$pdo_pass = 'localpass'; 

try { 
    $db = new PDO($pdo_db, $pdo_login, $pdo_pass, array(
     PDO::ATTR_ERRMODE => $localhost ? PDO::ERRMODE_EXCEPTION : PDO::ERRMODE_SILENT, 
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // METHOD #2 
    )); 
    $db -> exec('SET NAMES utf8'); // METHOD #3 
    $db -> exec('SET CHARACTER SET utf8'); // METHOD #4 
    $db -> exec('SET time_zone = \''.date_default_timezone_get().'\''); 
} catch (PDOException $error) { 
    die($error -> getMessage()); 
} 

Quindi, quello che ho capito, è che il metodo 1 funzionano solo con PHP 5.3+ (ma sembra che si tratta di un buggy po'), e il metodo 2 è solo per MySQL. Le differenze tra i metodi 3 e 4 sono MySQL thing, ma non so ancora quale sia il migliore. E c'è un modo per chiamare SET NAMES in attributi PDO, ma non solo per MySQL?

Grazie!

risposta

6

impostazione nel DSN è l'unico modo corretto (anche se è supportato solo dal 5.3).
È possibile questo e SET NAMES allo stesso tempo.

Tutti gli altri modi renderanno possibile l'infame iniezione GBK half-fiction.

Si noti che le impostazioni per error_reporting() sono completamente errate. deve essere incondizionato -1. Se si è preoccupati per errori di visualizzazione - c'è una corretta impostazione ini per questo, chiamato display_errors, può essere impostato in fase di esecuzione.
Mentre error_reporting imposta livello dell'errore e deve essere sempre al massimo.

+0

Quindi per <5.3, SET NAMES COLLATE e cie, ma 5.3.0 e precedenti, il metodo # 1 è davvero sufficiente? E posso lasciarli entrambi? Oh e non capisco il tuo punto: perché deve essere incondizionato -1? Non voglio che gli errori vengano visualizzati quando sono nt localhost ... (Grazie per questo consiglio off-topic btw!) – Joan

+0

Sembra tutto a posto! Quindi la 2a riga diventa 'error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan

-2

ho sempre nel mio file dbconfig scrivere questi codice:

mysql_query("SET character_set_results = 'utf8', 
       character_set_client = 'utf8', 
       character_set_connection = 'utf8', 
       character_set_database = 'utf8', 
       character_set_server = 'utf8'"); 
+0

sì ma per quanto riguarda il pdo? l'OP non dovrebbe preferire una soluzione PDO o mysqli? – luchosrock

+0

Quindi 'SET NAMES' utf8 'COLLATE' utf8_general_ci'' una scorciatoia di quello? – Joan

+0

@Didjo sì, ma controlla tutti gli input e gli output dall'interfaccia web anche – Ehsan