Согласно php.net, StackOverflow и другим источникам доверия, я могу найти 4 разных способа установки UTF-8 на PDO-соединение, но не могу найти, какой из них лучше выбрать.
Код подключения PDO (и некоторые 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()); }
Итак, я понял, что метод 1 работает только с PHP 5.3+ (но кажется, что он немного глючит), а метод 2 – только для MySQL. Различия между методом 3 и 4 – это вещь MySQL , но я до сих пор не знаю, какой из них лучше. И есть ли способ вызвать SET NAMES в атрибутах PDO, но не только для MySQL?
Благодаря!
Установка его в DSN является единственным правильным способом (хотя поддерживается только с 5.3).
Вы можете использовать этот и SET NAMES
одновременно.
Все другие способы сделают возможным печально известную инъекцию GBK.
Обратите внимание, что ваша установка error_reporting () совершенно неверна. он должен быть безусловным -1. Если вы беспокоитесь о отображении ошибок – для этого есть правильная настройка ini, называемая display_errors
, которая может быть установлена во время выполнения.
В то время как error_reporting устанавливает уровень ошибки и должен быть максимальным все время.
Я всегда в файле dbconfig записываю этот код:
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");