Здравствуйте. Denwer на windows 7, вот весь код: Код (Text): $db = new PDO('mysql:host=192.168.1.1', 'root', ''); Почему предупреждение выдается в кодировке win-1251 (ну и на utf-8 странице соответственно вместо кириллицы знаки вопроса)? Код (Text): Warning: PDO::__construct() [<a href='pdo.--construct'>pdo.--construct</a>]: [2002] ����������� �� �����������, �.�. �������� ��������� ������ ������ �� �����������. (trying to connect via tcp://192.168.1.1:3306) in Z:\home\test.ru\www\index.php on line 4 А здесь просто текст, отображается корректно. В httpd.conf и .htaccess - AddDefaultCharset utf-8 В php.ini default_charset = "utf-8" Кодировка php-файла utf-8 без BOM В браузере кодировка юникод и другой текст на странице отображается корректно.
По тому, что это дефолтная кодировка соединения, видимо. Можно либо отредактировать my.cnf - "init-connect='SET NAMES utf8'", либо явно указать кодировку соединения в классе PDO, надо думать. Добавлено спустя 4 минуты 31 секунду: Кстати, что там за атрибут пустой, не кодировка ли как раз?
character-set-server = utf8 init-connect = "set names utf8" default-character-set = utf8 Сообщение PDOException приходит в cp1251 Пароль
Аналогичная картина. Насколько я понимаю, соединение не установлено, соответственно, сообщение создается до этого.
тогда так: Код (Text): $db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
Код (Text): <? try { $dbh = new PDO('mysql:host=192.168.1.1;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')); } catch (PDOException $e) { echo 'Подключение не удалось: ' . $e->getMessage(); } ?> Код (Text): Подключение не удалось: SQLSTATE[HY000] [2002] ����������� �� �����������, �.�. �������� ��������� ������ ������ �� �����������.
Все иссяк, больше мыслей нет пока. Добавлено спустя 19 минут 15 секунд: Разве что одна еще - выкинь нахрен этот денвер. )) Чего бы не поднять нормальный сервер в VirtualBox?
У меня такая схема работает Код (Text): $db = new PDO($connect_str,DB_USER,DB_PASS); $db->query("SET NAMES utf8"); да и это тоже Код (Text): <meta http-equiv="content-type" content="text/html; charset=utf-8">
Это не правильно. Если php < 5.3 то MYSQL_ATTR_INIT_COMMAND если >=5.3 то можно использовать charset=UTF8
Да ежкин код, народ, вы по существу отвечайте плз. Есть нормальный сервер на VirtualBox, мне интересно узнать почему именно в данном случае php себя так ведет. Кодировка страницы utf-8 Как? Если Exception будет выкинут еще до второй строки. Версия php 5.3.8
Если не ошибаюсь где то обсуждалась подобная тема... Попробуй создать htaccess и пропиши там AddDefaultCharset UTF-8
Прописывал, то же самое. Вот, что обнаружил: Код (Text): var_dump(setlocale(LC_ALL, null)); Код (Text): string 'Russian_Russia.1251' (length=19) Видимо из-за локали не хочет uft8 показывать.
Возможные варианты для My.cnf Код (Text): [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect='SET NAMES utf8' character-set-server = utf8 колдуй
Все не то. Указано же, что никакого сервера mysql нет. Видимо проблема из-за багов локали php 5.3 в windows, решил просто через iconv конвертировать в utf-8. Код (Text): class Cp1251ErrorExeption extends ErrorException { public function getUtfMessage() { return iconv('cp1251', 'utf-8', $this->getMessage()); } function handleError($errno, $errstr, $errfile, $errline, array $errcontext){ if (0 === error_reporting()) return false; throw new self($errstr, 0, $errno, $errfile, $errline); } } try { try { set_error_handler('Cp1251ErrorExeption::handleError'); $db = new PDO('mysql:host=192.168.1.1;dbname=mydb'); } catch (PDOException $e) { throw new Cp1251ErrorExeption($e->getMessage()); } } catch (Cp1251ErrorExeption $e) { echo $e->getUtfMessage(); } restore_error_handler();
Вопрос всё еще актуален. На windows 10 + XAMPP такая же ситуация. Пожалуйста, подскажите адекватное решение без iconv(), если возможно.