Để hoàn thiện, thực tế có ba cách để đặt mã hóa khi kết nối với MySQL từ PDO và cách nào khả dụng tùy thuộc vào phiên bản PHP của bạn. Thứ tự ưu tiên sẽ là:
charset
tham số trong chuỗi DSN
- Chạy
SET NAMES utf8
với PDO::MYSQL_ATTR_INIT_COMMAND
tùy chọn kết nối
- Chạy
SET NAMES utf8
thủ công
Mã mẫu này thực hiện cả ba:
<?php
define('DB_HOST', 'localhost');
define('DB_SCHEMA', 'test');
define('DB_USER', 'test');
define('DB_PASSWORD', 'test');
define('DB_ENCODING', 'utf8');
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
if( version_compare(PHP_VERSION, '5.3.6', '<') ){
if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
}
}else{
$dsn .= ';charset=' . DB_ENCODING;
}
$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);
if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
$sql = 'SET NAMES ' . DB_ENCODING;
$conn->exec($sql);
}
Làm cả ba có lẽ là quá mức cần thiết (trừ khi bạn viết một lớp bạn dự định phân phối hoặc sử dụng lại).