Я использую PDO для подключения к базе данных MYSQL
все таблицы в базе данных имеют utf8_unicode_ci Collation
вот мой код подключения:
<?php $mysql_username = "root"; $mysql_password = ""; $mysql_host = "localhost"; $mysql_database = "cms"; try { //connect global $db; $db = new PDO('mysql:dbname=' . $mysql_database . ';host=' . $mysql_host . ';charset=utf8;', $mysql_username, $mysql_password); $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8'); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $ex) { die("Unable Connect To DataBase"); } ?>
в localhost у меня нет проблем с кодировкой, но когда я загрузил источник на хост, я вижу ?????? вместо персонажей?
Эта:
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES utf8');
совершенно бессмысленно. См. http://php.net/manual/en/ref.pdo-mysql.php . MYSQL_ATTR_INIT_COMMAND
выполняется сразу после установления соединения, не позже. Если вы установите это на уже полностью созданном объекте PDO, это слишком поздно и никогда не выполняется. Вам нужно передать его конструктору:
new PDO(..., ..., ..., array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'))
Кроме того, если ваша версия PHP поддерживает его, добавьте charset=utf8
в DSN.