2012-12-26 110 views
8

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!

Trả lời

6

Đặt nó trong DSN là chỉ cách thích hợp (mặc dù nó chỉ được hỗ trợ từ 5.3).
Bạn có thể làm điều này một lần và SET NAMES cùng một lúc.

Tất cả các cách khác sẽ làm cho việc tiêm GBK nửa hư cấu khét tiếng có thể xảy ra.

Xin lưu ý rằng cài đặt của bạn cho error_reporting() hoàn toàn sai. nó phải là vô điều kiện -1. Nếu bạn lo ngại về việc hiển thị lỗi - có cài đặt ini thích hợp cho điều này, được gọi là display_errors, có thể được đặt khi chạy.
Trong khi error_reporting đặt cấp lỗi và phải ở mức tối đa mọi lúc.

+0

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

+0

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

-2

tôi luôn luôn trong tập tin dbconfig tôi viết những mã:

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

vâng nhưng còn về pdo thì sao? không nên OP thích một giải pháp PDO hoặc mysqli? – luchosrock

+0

Vì vậy, là 'SET NAMES' utf8 'COLLATE' utf8_general_ci'' một phím tắt của điều đó? – Joan

+0

@Didjo yeah nhưng nó kiểm soát tất cả các đầu vào và đầu ra từ giao diện web quá – Ehsan