2012-12-26 6 views
8

Laut php.net, StackOverflow und anderen Quellen des Vertrauens, kann ich 4 verschiedene Möglichkeiten finden, UTF-8 auf PDO-Verbindung zu setzen, kann aber nicht finden, welche ist besser zu wählen.PDO-Verbindung: UTF-8 Deklaration mit SET NAMES/CHARACTER SET?

Ein PDO-Verbindungscode (und einige 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()); 
} 

Also, was ich verstanden habe, ist, dass die Methode nur 1 mit PHP arbeiten 5.3+ (aber es scheint, dass es ein bisschen Buggy ist), und Methode 2 ist nur für MySQL. Unterschiede zwischen Methode 3 und 4 ist MySQL thing, aber ich weiß immer noch nicht, welche besser ist. Und gibt es eine Möglichkeit, SET NAMES in PDO-Attributen aufzurufen, aber nicht nur für MySQL?

Danke!

Antwort

6

es in DSN Einstellung ist die nur richtige Art und Weise (obwohl es erst seit 5.3 unterstützt wird).
Sie können diese und SET NAMES gleichzeitig.

Alle anderen Möglichkeiten werden berüchtigte halb-fiktive GBK-Injektion möglich machen.

Bitte beachten Sie, dass Ihre Einstellung für error_reporting() völlig falsch ist. es muss unbedingt sein -1. Wenn Sie über Fehler Fehler betroffen sind - es gibt eine ordnungsgemäße ini-Einstellung für diese, genannt display_errors, kann zur Laufzeit festgelegt werden.
Während error_reporting setzt Ebene des Fehlers und sollte die ganze Zeit bei max.

+0

Also für <5.3, SET NAMES COLLATE und cie, aber 5.3.0 und vorher, Methode # 1 ist nur wirklich genug? UND, kann ich beides lassen? Oh, und ich verstehe Ihren Standpunkt nicht: warum muss es unbedingt sein -1? Ich möchte keine Fehler anzeigen, wenn ich nicht localhost bin ... (Danke für diesen Off-Topic-Tipp übrigens!) – Joan

+0

Es hört sich total richtig an! So wird die zweite Zeile zu 'error_reporting (-1); ini_set ('display_errors', $ localhost); '. – Joan

-2

ich immer in meiner dbconfig Datei diesen Code schreiben:

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

ja aber was ist mit der PDO? sollte das OP nicht eine PDO oder mysqli Lösung bevorzugen? – luchosrock

+0

Also ist 'SET NAMES' utf8 'COLLATE' utf8_general_ci'' eine Abkürzung davon? – Joan

+0

@Didjo yeah aber es steuert alle Ein- und Ausgänge von Web-Schnittstelle zu – Ehsan