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