За последние 24 часа нас посетил 22631 программист и 1046 роботов. Сейчас ищут 657 программистов ...

PDO кодировка Warnings

Тема в разделе "PHP для новичков", создана пользователем IvanDraga, 10 ноя 2013.

  1. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Здравствуйте.

    Denwer на windows 7, вот весь код:
    Код (Text):
    1. $db = new PDO('mysql:host=192.168.1.1', 'root', '');
    Почему предупреждение выдается в кодировке win-1251 (ну и на utf-8 странице соответственно вместо кириллицы знаки вопроса)?

    Код (Text):
    1.  
    2. 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
    3. А здесь просто текст, отображается корректно.
    В httpd.conf и .htaccess - AddDefaultCharset utf-8
    В php.ini default_charset = "utf-8"
    Кодировка php-файла utf-8 без BOM
    В браузере кодировка юникод и другой текст на странице отображается корректно.
     
  2. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    По тому, что это дефолтная кодировка соединения, видимо. Можно либо отредактировать my.cnf - "init-connect='SET NAMES utf8'", либо явно указать кодировку соединения в классе PDO, надо думать.

    Добавлено спустя 4 минуты 31 секунду:
    Кстати, что там за атрибут пустой, не кодировка ли как раз?
     
  3. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    character-set-server = utf8
    init-connect = "set names utf8"
    default-character-set = utf8

    Сообщение PDOException приходит в cp1251

    Пароль
     
  4. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    Код (Text):
    1. $link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
     
  5. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Аналогичная картина. Насколько я понимаю, соединение не установлено, соответственно, сообщение создается до этого.
     
  6. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    тогда так:
    Код (Text):
    1. $db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
     
  7. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Код (Text):
    1.  
    2. <?
    3. try {
    4.     $dbh = new PDO('mysql:host=192.168.1.1;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
    5. } catch (PDOException $e) {
    6.     echo 'Подключение не удалось: ' . $e->getMessage();
    7. } ?>
    Код (Text):
    1.  
    2. Подключение не удалось: SQLSTATE[HY000] [2002] ����������� �� �����������, �.�. �������� ��������� ������ ������ �� �����������.
     
  8. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    Все иссяк, больше мыслей нет пока. :)

    Добавлено спустя 19 минут 15 секунд:
    Разве что одна еще - выкинь нахрен этот денвер. )) Чего бы не поднять нормальный сервер в VirtualBox?
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Кодировку страницы укажи правильно
     
  10. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    У меня такая схема работает
    Код (Text):
    1.     $db = new PDO($connect_str,DB_USER,DB_PASS);
    2.     $db->query("SET NAMES utf8");
    да и это тоже
    Код (Text):
    1.  <meta http-equiv="content-type" content="text/html; charset=utf-8">
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Это не правильно.

    Если php < 5.3 то MYSQL_ATTR_INIT_COMMAND если >=5.3 то можно использовать charset=UTF8
     
  12. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Да ежкин код, народ, вы по существу отвечайте плз.

    Есть нормальный сервер на VirtualBox, мне интересно узнать почему именно в данном случае php себя так ведет.

    Кодировка страницы utf-8

    Как? Если Exception будет выкинут еще до второй строки.

    Версия php 5.3.8
     
  13. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Если не ошибаюсь где то обсуждалась подобная тема...
    Попробуй создать htaccess и пропиши там AddDefaultCharset UTF-8
     
  14. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Прописывал, то же самое. Вот, что обнаружил:
    Код (Text):
    1. var_dump(setlocale(LC_ALL, null));
    Код (Text):
    1. string 'Russian_Russia.1251' (length=19)
    Видимо из-за локали не хочет uft8 показывать.
     
  15. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    Из-за локали, скорее всего, да. Из-за её отсутствия, точнее.
    Потому, что это денвер.
     
  16. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Возможные варианты для My.cnf
    Код (Text):
    1.  
    2. [client]
    3. default-character-set=utf8
    4.  
    5. [mysql]
    6. default-character-set=utf8
    7.  
    8. [mysqld]
    9. collation-server = utf8_unicode_ci
    10. init-connect='SET NAMES utf8'
    11. character-set-server = utf8
    колдуй
     
  17. IvanDraga

    IvanDraga Новичок

    С нами с:
    10 ноя 2013
    Сообщения:
    39
    Симпатии:
    0
    Все не то. Указано же, что никакого сервера mysql нет. Видимо проблема из-за багов локали php 5.3 в windows, решил просто через iconv конвертировать в utf-8.

    Код (Text):
    1.  
    2. class Cp1251ErrorExeption extends ErrorException {
    3.     public function getUtfMessage() {
    4.         return iconv('cp1251', 'utf-8', $this->getMessage());
    5.     }  
    6.     function handleError($errno, $errstr, $errfile, $errline, array $errcontext){
    7.         if (0 === error_reporting())
    8.             return false;
    9.     throw new self($errstr, 0, $errno, $errfile, $errline);
    10.     }
    11. }
    12.  
    13. try {
    14.     try {
    15.         set_error_handler('Cp1251ErrorExeption::handleError');  
    16.         $db = new PDO('mysql:host=192.168.1.1;dbname=mydb');    
    17.     } catch (PDOException $e) {
    18.         throw new Cp1251ErrorExeption($e->getMessage());
    19.     }  
    20. } catch (Cp1251ErrorExeption $e) {
    21.     echo $e->getUtfMessage();  
    22. }
    23. restore_error_handler();
     
  18. SoulMan

    SoulMan Новичок

    С нами с:
    9 июл 2017
    Сообщения:
    1
    Симпатии:
    0
    Вопрос всё еще актуален. На windows 10 + XAMPP такая же ситуация. Пожалуйста, подскажите адекватное решение без iconv(), если возможно.