Theo php.net, StackOverflow và các nguồn tin tưởng khác, tôi có thể tìm thấy 4 cách khác nhau để đặt UTF-8 trên kết nối PDO, nhưng không thể tìm được cái nào là tốt hơn để chọn.Kết nối PDO: Khai báo UTF-8 bằng SET NAMES/CHARACTER SET?
Một PDO mã kết nối (và một số trong tệp):
$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());
}
Vì vậy, những gì tôi hiểu, đó là Phương pháp 1 chỉ làm việc với PHP 5.3+ (nhưng có vẻ như đó là một lỗi bit), và phương pháp 2 chỉ dành cho MySQL. Sự khác biệt giữa phương pháp 3 và 4 là MySQL thing, nhưng tôi vẫn không biết cái nào tốt hơn. Và có cách nào để gọi SET NAMES trong thuộc tính PDO, nhưng không chỉ cho MySQL?
Cảm ơn!
Vì vậy, đối với <5.3, SET NAMES COLLATE và cie, nhưng 5.3.0 và trước đó, phương pháp # 1 chỉ thực sự là đủ? VÀ, tôi có thể để cả hai? Ồ, tôi không hiểu điểm của bạn: tại sao nó phải là vô điều kiện -1? Tôi không muốn lỗi hiển thị khi tôi nt localhost… (Cảm ơn bạn đã tư vấn về chủ đề này!) – Joan
Nghe có vẻ hoàn toàn đúng! Vì vậy, dòng thứ 2 trở thành 'error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan