Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите с MySQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Иероглифы в БД
Virus1850
Отправлено: 27 Апреля, 2012 - 00:06:31
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)

[+]


Есть вот такой обработчик:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /*** mysql hostname ***/
  3.  
  4. $hostname = '***';
  5.  
  6. /*** mysql username ***/
  7. $username = '***';
  8.  
  9. /*** mysql password ***/
  10. $password = '***';
  11.  
  12. $dbname = 'web';
  13.  
  14. try {
  15.     $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
  16.  
  17. if($_POST['name']) {
  18.     $name       = $_POST['name'];
  19.     $message    = $_POST['message'];
  20.     /*** set all errors to execptions ***/
  21.     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  22.  
  23.     $sql = "INSERT INTO shoutbox (date_time, name, message)
  24.            VALUES (NOW(), :name, :message)";
  25.     /*** prepare the statement ***/
  26.     $stmt = $dbh->prepare($sql);
  27.  
  28.     /*** bind the params ***/
  29.     $stmt->bindParam(':name', $name, PDO::PARAM_STR);
  30.     $stmt->bindParam(':message', $message, PDO::PARAM_STR);
  31.  
  32.     /*** run the sql statement ***/
  33.     if ($stmt->execute()) {
  34.         populate_shoutbox();
  35.     }
  36. }
  37. }
  38. catch(PDOException $e) {
  39.     echo $e->getMessage();
  40. }
  41.  
  42. if($_POST['refresh']) {
  43.     populate_shoutbox();
  44. }
  45.  
  46.  
  47. function populate_shoutbox() {
  48.     global $dbh;
  49.     $sql = "select * from shoutbox order by date_time desc limit 10";
  50.     echo '<ul>';
  51.     foreach ($dbh->query($sql) as $row) {
  52.         echo '<li>';
  53.         echo '<span class="date">'.date("d.m.Y H:i", strtotime($row['date_time'])).'</span>';
  54.         echo '<span class="name">'.$row['name'].'</span>';
  55.         echo '<span class="message">'.$row['message'].'</span>';
  56.         echo '</li>';
  57.     }
  58.     echo '</ul>';
  59. }
  60. ?>
  61.  

А вот запрос на БД

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `shoutbox` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `date_time` datetime NOT NULL,
  4.   `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  5.   `message` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  6.   PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM



Проблема в том что данные на русском, в таблице `message` и `name` отображаются иероглифами, с английским и цифрами все норм. Подскажите как исправить.

P.S кодировку на таблицах изменил на cp1251_general_ci все равно не помогло(


Скрин таблиц:
 
 Top
Bio man
Отправлено: 27 Апреля, 2012 - 00:23:59
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Во первых collation это не кодировка самих данных в БД. Оставь юникод как был.
После подключения к БД отправь запрос
или mysql_set_charset()
(Добавление)
Bio man пишет:
или mysql_set_charset()
а, у тебя PDO... не посмотрел сразу...
 
 Top
Virus1850
Отправлено: 27 Апреля, 2012 - 00:37:10
Post Id


Новичок


Покинул форум
Сообщений всего: 38
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)

[+]


Bio man пишет:
Во первых collation это не кодировка самих данных в БД. Оставь юникод как был.
После подключения к БД отправь запрос
или mysql_set_charset()
(Добавление)
Bio man пишет:
или mysql_set_charset()
а, у тебя PDO... не посмотрел сразу...


В результате:



все то же самое....
 
 Top
Striker
Отправлено: 30 Апреля, 2012 - 18:54:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 128
Дата рег-ции: Июль 2011  
Откуда: Киев


Помог: 1 раз(а)

[+]


Virus1850
Знакомая ситуация. Лично мне помогло такое вот решение: http://forum.php.su/topic.php?fo...60384#1335460384
 
 Top
Lovelass
Отправлено: 02 Мая, 2012 - 05:22:48
Post Id



Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Май 2012  
Откуда: Челябинск/Волгоград


Помог: 0 раз(а)




1. PHP использует неверную кодировку в качестве клиентской.

Симптомы:
Через phpMyAdmin (здесь и далее подразумевается версия умеющая работать с кодировками, т.е. >= 2.6.0) все по-русски, а в скрипт приходят вопросительные знаки.
Скрипт, заносящий данные в базу, видит русский нормально, а после вставки, как в правильном скрипте, так и в phpMyAdmin-е — знаки вопросов.

Тестирование:
Попробуйте в начале вашего скрипта, но после соединения, выполнить SQL-запрос "SET NAMES кодировка". Где кодировка - та кодировка, в которой у вас (по вашему мнению) данные. Например, для русской Windows кодировки (windows-1251) это будет cp1251, для KOI8-R – koi8r, для UTF-8 – utf8 и так далее. В дальнейшем она будет упоминаться как "кодировка".

Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит, данные в базе лежат в правильной кодировке, сама база эту самую кодировку и использует.
Если буквы стали русскими, а слова нет ("бнопня"), значит, скрипт ожидает данные в другой русской кодировке — пробуйте другие, пока не получится русских слов.

Решение:
1) Оставить запрос "SET NAMES кодировка" в начале скрипта. Если скриптов много – см. вариант 2.

2) Заставить MySQL автоматически выполнять этот запрос при каждом соединении с ним.
Для этого необходимо в конфигурационном файле MySQL, в секции [mysqld] добавить следующую строку: init-connect="SET NAMES кодировка".

Однако, следует заметить, что это НЕ будет работать, если пользователь, которым вы подключаетесь к базе имеет привилегию SUPER (а стандартный пользователь root к таким относится, так же как и все созданные через "GRANT ALL PRIVILEGES ON *.* TO ..."). Это сделано для того, чтобы в случае ошибки в этом запросе (а его можно изменить во время работы), хоть кто-то мог подключиться к базе и исправить его.

Внимание! Функция mysqli_client_encoding() и сотоварищи, отображает кодировку клиента на момент соединения и не меняют возвращаемое значение в процессе работы. Поэтому не стоит кричать, что кодировка не меняется. Просто делайте, что говорят и смотрите результат работы скрипта. Получить нужное значение можно SQL-запросом "SHOW VARIABLES LIKE 'character_set_client'".

3) Начиная с версий 4.1.15 и 5.0.13 добавить в секцию [mysqld] или [server] конфигурационного файла MySQL параметр skip-character-set-client-handsh ake. Этот параметр заставляет сервер игнорировать кодировку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.


2. MySQL использует неверную кодировку

Симптомы:
Русский текст приходит в скрипт как русский, в консольном клиенте тоже все хорошо. Однако не работает сортировка, перевод в верхний/нижний регистр и т.д. Если применить решение из проблемы №1, то либо русский текст становится вопросами, либо mysql_error() возвращает сообщение похожее на "Illegal mix of collations (latin1_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE)...". В тоже время phpMyAdmin русский текст отображает как "крокозябры" (латинские символы с умляутами и т.д.).

Тестирование:
Попробуйте в phpMyAdmin'е выполнить запрос вида "SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица". Где "таблица" и "поле" - соответствующая таблица и поле с русским текстом, а "кодировка" — кодировка из проблемы №1.

Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
Если буквы стали русскими, а слова нет ("бнопня"), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.
Решение:
1) Установить для MySQL нужную кодировку по умолчанию.

Внимание! Это решение сработает сработает, только если кодировки не переопределены для базы, таблицы или столбца.
Для этого нужно в конфигурационном файле MySQL в секции [mysqld] добавить следующую строку:
default-character-set=cp1251

2) Сконвертировать таблицы в нужную кодировку.
Про то как конвертировать таблицы с неверными кодировками хорошо написано в мануале MySQL. Повторять здесь то же самое не к чему.
(Добавление)
Как сменить кодировку базы MySQL из командной строки
Допустим у нас есть база mysqldb, в неверной кодировке
по умолчанию. Мы хотим сменить ее в .

Используем вот такой скрипт:
PHP:
скопировать код в буфер обмена
  1. echo " DATABASE mysqldb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" | mysql; for i in `mysqlshow mysqldb % | grep -v + | cut -d ' ' -f2;`; do echo " TABLE mysqldb.$i DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;" | mysql ; done

Замените в скрипте mysqldb на название своей базы данных.


-----
Приходится нагонять упущенное.
PHP-Junior
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB