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!
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
Sembra tutto a posto! Quindi la 2a riga diventa 'error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan