Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PHP, MySQL и кодировка
 
 автор: Minstel   (07.01.2011 в 15:13)   письмо автору
 
 

Прошу помощи. Проблема с записью информации в MySQL из программ на PHP. Русские символы записываются в базу данных в виде абракадабры, обратно же считываются так, будто бы никаких ошибок и не было, нормальным текстом. В базе данных выставлена кодировка w-cp1251. Также проблемы с записью строк в поле с типом "дата и время" . Записываемая строка не воспринимается правильно, и вместо записываемой даты сохраняется некая произвольная дата, совсем не похожая на ту, которая должна была быть сохранена.

  Ответить  
 
 автор: Trianon   (07.01.2011 в 15:21)   письмо автору
 
   для: Minstel   (07.01.2011 в 15:13)
 

В какой кодирорвке текст php-скрипта?
Оператор SET NAMES применяете?
приводите код соединения с БД.
приводите структуру таблицы.
приводите текст запроса к БД.

  Ответить  
 
 автор: Minstel   (07.01.2011 в 21:59)   письмо автору
 
   для: Trianon   (07.01.2011 в 15:21)
 


mysql> SHOW VARIABLES LIKE '%char%';
+-------------------------------------------------+
| Variable_name                 |      value     |
+--------------------------------------------------+
character_set_client          |    cp1251   |
character_set_connection|    cp1251   |
character_set_database   |   cp1251   |
character_set_filesystem |    binary     |
character_set_results       |   cp1251    |
character_set_server         |   cp1251    |
character_set_system       |   utf8          |
character_sets_dir               |    G:\MySQL\share\charsets


Оператор SET NAMES применяю:
 mysql_query("SET NAMES 'cp1251';")


Также пробовал и вот так:
 mysql_set_charset('cp1251') 


В php-скриптах пытаюсь явно указывать кодировку передаваемых данных:
 header("Content-type: text/html, charset=windows-1251") 


Соединение с базой данных:

$dbUsers = @mysql_connect($host, $user, $pass);
$ask = mysql_select_db($db);
$ask = mysql_set_charset('cp1251');


Запрос на создание таблицы:
 
$ask=mysql_query("CREATE TABLE IF NOT EXISTS $tableNews (
id_news INT NOT NULL AUTO_INCREMENT,
name TINYTEXT NOT NULL,
body TEXT NOT NULL,
putdate TINYTEXT NOT NULL,
url TINYTEXT,
urltext TINYTEXT,
urlpict TINYTEXT,
hide ENUM ('show', 'hide') NOT NULL DEFAULT 'show',
PRIMARY KEY (id_news));");


Запрос на запись к таблице:

$ask=mysql_query("INSERT INTO $tableNews (name, body, putdate, url, urltext) 
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');");


Для написания скриптов использую Notepad2. Раньше не обращал внимание на кодировку самого файла скрипта. Сейчас проверил ее, изменил с той, что была (не помню, какая) на 1251.
Все равно проблема остается.

  Ответить  
 
 автор: Trianon   (07.01.2011 в 22:57)   письмо автору
 
   для: Minstel   (07.01.2011 в 21:59)
 

всё очень хорошо привели, кроме одного.

вот это
$ask=mysql_query("INSERT INTO $tableNews (name, body, putdate, url, urltext) 
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');");


- это не запрос.
Это код на php, который этот запрос готовит и испускает.

А запрос будет если
$sql = "INSERT INTO $tableNews (name, body, putdate, url, urltext) 
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');";

echo $sql;

  Ответить  
 
 автор: Minstel   (08.01.2011 в 11:07)   письмо автору
 
   для: Trianon   (07.01.2011 в 22:57)
 

Если я правильно вас понял, нужно посмотреть, каков результат вывода строки такого запроса в браузер? Если да, то если произвести этот вывод, русские буквы сохраняются, никаких неизвестных символов не появляется. Зато обнаружилось, что неправильно выводится время. Стало быть, ошибка с датой находится в коде самого скрипта, и к базе данных отношения не имеет.
Ошибку эту нашел и исправил. Большое спасибо.)
Осталась проблема с русскими символами.

  Ответить  
 
 автор: Trianon   (08.01.2011 в 11:42)   письмо автору
 
   для: Minstel   (08.01.2011 в 11:07)
 

Если в запросе на создание таблицы Вы не указали кодировку, кодировка таблицы была унаследована из кодировки базы данных. И могла оказаться неверной.
Кодировка БД сама по себе тоже могла быть установлена запросом создания (изменения свойств) БД, а могла быть унаследована из кодировки сервера на момент создания.
Кстати запрос SHOW VARIABLES LIKE '%char%' имеет смысл издать из скрипта. Уж коль скоро Вам не нравится ситуация со скриптовым подключением (а не с консольным).
Ну и действительно SHOW CREATE TABLE tbl; и SHOW CREATE DATABASE db; могут прояснить ситуацию.

  Ответить  
 
 автор: lightning.say   (08.01.2011 в 12:03)   письмо автору
 
   для: Trianon   (08.01.2011 в 11:42)
 

->Кстати запрос SHOW VARIABLES LIKE '%char%' имеет смысл издать из скрипта. Уж коль
->скоро Вам не нравится ситуация со скриптовым подключением (а не с консольным).
А одни и те же переменные из под скрипта и в консоли могут принимать разные значения, в каком случае?

  Ответить  
 
 автор: Trianon   (08.01.2011 в 12:07)   письмо автору
 
   для: lightning.say   (08.01.2011 в 12:03)
 

Запрос SHOW VARIABLES выдает сессионные значения.
Сессии-то явно разные, так что настройки соединения у них могут (и по большому счету должны) быть выполнены по-разному - Windows-консоль по умолчанию работает в 866 кодовой странице.

сессией (в данном контексте) я называю сеанс подключения клиента БД к серверу БД

  Ответить  
 
 автор: lightning.say   (08.01.2011 в 02:01)   письмо автору
 
   для: Minstel   (07.01.2011 в 21:59)
 

MYSQL команда
SHOW CREATE TABLE ИМЯ_ВАШЕЙ_ТАБИЦЫ;
в DEFAULT CHARSET что пишет?

  Ответить  
 
 автор: Minstel   (08.01.2011 в 13:37)   письмо автору
 
   для: lightning.say   (08.01.2011 в 02:01)
 


mysql>SHOW CREATE DATABASE users;

......    CREATE DATABASE 'users' /*!40100 DEFAULT CHARACTER SET cp1251



mysql>SHOW CREATE TABLE systemNews;

...... DEFAULT CHARSET=cp 1251

  Ответить  
 
 автор: Trianon   (08.01.2011 в 14:08)   письмо автору
 
   для: Minstel   (08.01.2011 в 13:37)
 

Вот Вы написали
Русские символы записываются в базу данных в виде абракадабры,

Откуда был сделан такое вывод, если обратно все выводится без проблем?
Где Вы усмотрели абракадабру?

  Ответить  
 
 автор: Minstel   (08.01.2011 в 14:30)   письмо автору
 
   для: Trianon   (08.01.2011 в 14:08)
 

А-а... Кажется, понял.) Дело в том, что я проверяю качество записи через коноль MySQL... Записываю из скрипта, а потом смотрю в консоль. Но если она работает в какой-то своей кодировке, так, наверное, и должно быть - она не будет правильно воспринимать некоторую информацию, записанную из скрипта. Хотя все и записано правильно.
Все действительно может быть так? Если да, тогда вопрос снимается.))

  Ответить  
 
 автор: Trianon   (08.01.2011 в 14:32)   письмо автору
 
   для: Minstel   (08.01.2011 в 14:30)
 

в консолmyjv клиенте (для просмотра), устанавливая соединение, нужно исполнять запрос SET NAMES 'cp866';

  Ответить  
 
 автор: Minstel   (08.01.2011 в 14:47)   письмо автору
 
   для: Trianon   (08.01.2011 в 14:32)
 

Все, понятно.) Большое спасибо за помощь.)

  Ответить  
 
 автор: lightning.say   (07.01.2011 в 15:57)   письмо автору
 
   для: Minstel   (07.01.2011 в 15:13)
 

кодировка сайта (приложения, charset of content-type text/html) , клиентского соединения (то есть кодировки, в которой принимается запрос character_set_connection, кодировки, в которой выдается результат character_set_results ) и кодировки самих полей в таблицах.
Вот это должно совпадать обязательно.

P.S. автор: Trianon

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования