2012-12-26 20 views
8

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!

Odpowiedz

6

Ustawienie go w DSN jest tylko właściwy sposób (choć jest obsługiwana tylko od 5.3).
Możesz to zrobić i SET NAMES w tym samym czasie.

Wszystkie inne sposoby mogą spowodować niesławny, pół fikcyjny zastrzyk GBK.

Należy pamiętać, że ustawienie dla error_reporting() jest całkowicie błędne. musi być bezwarunkowe -1. Jeśli martwisz się o błędy wyświetlające błędy - w tym samym czasie można ustawić odpowiednie ustawienie ini o nazwie display_errors.
Podczas gdy zgłoszenie_błędności ustawia poziom błędu i powinno być maksymalne przez cały czas.

+0

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

+0

Brzmi zupełnie poprawnie! Więc druga linia staje się "error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan

-2

zawsze w moim pliku dbconfig napisać te kod:

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

tak, ale co z pdo? Czy OP nie powinien preferować rozwiązania PDO lub mysqli? – luchosrock

+0

Więc "SET NAMES" utf8 "COLLATE" utf8_general_ci'' skrót to? – Joan

+0

@Didjo tak, ale kontroluje wszystkie wejścia i wyjścia z interfejsu sieciowego też – Ehsan