Według php.net, StackOverflow i innych źródeł zaufania, mogę znaleźć 4 różne sposoby ustawienia UTF-8 na połączeniu PDO, ale nie mogę znaleźć takiego, którego lepiej wybrać.Połączenie PDO: Deklaracja UTF-8 z SET NAMES/CHARACTER SET?
PDO kod połączenia (a niektóre 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());
}
Więc, co zrozumiałem, jest to, że metoda 1 działają tylko z PHP 5.3+ (ale wydaje się, że jest to trochę buggy) oraz metoda 2 jest tylko dla MySQL. Różnice między metodami 3 i 4 to MySQL thing, ale nadal nie wiem, który z nich jest lepszy. I czy istnieje sposób na wywołanie SET NAMES w atrybutach PDO, ale nie tylko w MySQL?
Dzięki!
Więc <5.3, SET NAMES COLLATE i cie, ale 5.3.0 i wcześniejsze, tylko metoda nr 1 jest wystarczająca? I, czy mogę pozwolić obu? Och i nie rozumiem twojego powodu: dlaczego to musi być bezwarunkowe -1? Nie chcę, aby błędy wyświetlały się, gdy jestem nt localhost ... (Dzięki za porady off-topic btw!) – Joan
Brzmi zupełnie poprawnie! Więc druga linia staje się "error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan