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

Форум MySQL

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

 

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

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

тема: В базу добавляются пустые строки, вместо русского текста.
 
 автор: Nice   (26.02.2010 в 13:07)   письмо автору
 
 

Здравствуйте. Помогите, пожалуйста, решить проблему. Маленькое предисловие, проблема обнаружена после смены хостера, как мне кажется касается MySQL, но возможно и php. Нив том, ни в другом сильно не разбираюсь, поэтому если тема не в нужном разделе - просьба модераторов перенести по месту назначения. И заключается в следующем... Есть маленький php скрипт, который загружал в базу *.csv файл, тем самым происходило обновление. На новом хостинге он стал это делать как-то странно. Скрипт, почему-то, перестал добавлять в базу, в соответствующие таблицы русский текст. Т.е. английский и цифры в порядке, а в полях, где должен содержаться русский текст, ничего нет, пустые места. Также в некоторых полях наблюдаются странные "искажения", русский текст добавляется частично. Скажем пример:
Должно быть:
Когда семейство Грейс переезжает в старый дом, стоящий на окраине, начинают твориться странные вещи...
А добавилось:
, стоящий на окраине, начинают твориться странные вещи...
"Откидывается" только первая часть текста. В чем это может быть проблема? Помогите с решением, пожалуйста. Подробные советы для чайника не помеха :)

  Ответить  
 
 автор: ЛЕНА   (26.02.2010 в 13:21)   письмо автору
 
   для: Nice   (26.02.2010 в 13:07)
 

Вы поменяли хостинг и кодировка базы данных теперь отличается от кодировки, которая была на старой базе.

  Ответить  
 
 автор: Лена   (26.02.2010 в 13:25)   письмо автору
 
   для: ЛЕНА   (26.02.2010 в 13:21)
 

Как бы я решала. Зайти на сервер старой базы данных. Посмотреть кодировку. Если зайти нельзя, посмотреть, в какой кодировке сделан архив базы(если он есть, конечно).
Дальше - зайти на сервер новой базы данных. Поставить кодировку в базе такую же, которая стояла на старой базе. Поставить кодировку в таблице такую же, какая была на старой таблице.
Или. Если в таблице уже есть данные - выполнить запрос.
ALTER TABLE table_name CONVERT TO CHARACTER SET здесь кодировка, которая вам нужна;

>Нив том, ни в другом сильно не разбираюсь
Не можете самостоятельно выполнить, обратитесь к тому, кто сможет это сделать.

  Ответить  
 
 автор: Nice   (26.02.2010 в 13:28)   письмо автору
 
   для: ЛЕНА   (26.02.2010 в 13:21)
 

Сейчас попробую.

  Ответить  
 
 автор: Лена   (26.02.2010 в 13:30)   письмо автору
 
   для: Nice   (26.02.2010 в 13:28)
 

Зайти в базы через PhpMyAdmin или другой клиент (это я самый простой случай указываю), найти свою базу и посмотреть.
Пока вам отвечала, вы уже сообщение поправили.

  Ответить  
 
 автор: Nice   (26.02.2010 в 13:50)   письмо автору
 
   для: Лена   (26.02.2010 в 13:30)
 

Поправил потому, что пока я писал, Вы уже дали ответы на мои вопросы :) На старый хостинг зайти уже нет возможности, но в дампе, если текстовым редактором открывать, SET NAMES cp1251 */;
На новом хостинге в PhpMyAdmin нашел базу, где там написана кодировка? В самом низу под списком всех таблиц следующее:
Таблиц: 26 Всего 321,115 MyISAM cp1251_general_ci 28.7 МБ
Причем как подсказка над cp1251_general_ci выскакивает "Кирилличекский (многоязычный), регистронезависимый (По умолчанию)". Это и есть кодировка, которая у текущего хостера? Просто ее поменять нельзя, а таблицы в базе в cp1251_general_cs.

  Ответить  
 
 автор: Лена   (26.02.2010 в 14:11)   письмо автору
 
   для: Nice   (26.02.2010 в 13:50)
 

Кодировка таблицы старой какая была? Смотрите в дампе.
Надо искать структуру таблицы, например:
--
-- Структура таблицы `blocks`
--

CREATE TABLE `blocks` (
`block_id` int(11) NOT NULL auto_increment,
`block_name` tinytext,
`pages` tinytext,
`area_id` tinyint(4) default NULL,
`pos` tinyint(4) NOT NULL,
`descr` mediumtext NOT NULL,
PRIMARY KEY (`block_id`),
FULLTEXT KEY `name_block` (`block_name`)
) ENGINE=MyISAM AUTO_INCREMENT=64 DEFAULT CHARSET=utf8 AUTO_INCREMENT=64 ;


В конце - DEFAULT CHARSET=utf8 кодировка. У вас какая?

В новой базе. Заходите в ПМА есть вкладка SQL
В ней выполняете запрос первый:
SHOW CREATE TABLE название таблицы, куда хотите положить данные.
Результат копируете и сюда выкладываете.
Запрос второй. Заходите в новую таблицу, в которую складываете данные, далее - опять вкладка SQL, делаете запрос:
SHOW VARIABLES LIKE '%char%'
Результат копируете и показываете здесь.

  Ответить  
 
 автор: Nice   (26.02.2010 в 14:20)   письмо автору
 
   для: Лена   (26.02.2010 в 14:11)
 

DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs;

  Ответить  
 
 автор: Лена   (26.02.2010 в 14:30)   письмо автору
 
   для: Nice   (26.02.2010 в 14:20)
 

Не все сделали, что просила.
И скрипт, если маленький, показывайте здесь. Может, причина в том, как вы делаете обработку CSV.

  Ответить  
 
 автор: Nice   (26.02.2010 в 14:34)   письмо автору
 
   для: Лена   (26.02.2010 в 14:30)
 

В старой таблице DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs;

1 запрос: база->sql->результат
Table Create Table
kino_films CREATE TABLE `kino_films` (\n `filmID` int(11) NOT NULL default '0',\n `filmType` varchar(10) collate cp1251_general_cs NOT NULL default '',\n `filmName` text collate cp1251_general_cs,\n `filmOname` text collate cp1251_general_cs,\n `filmTranslate` text collate cp1251_general_cs,\n `filmTime` int(11) default NULL,\n `filmSize` int(11) default NULL,\n `filmScreen` varchar(20) collate cp1251_general_cs default NULL,\n `filmGenre` text collate cp1251_general_cs,\n `filmYear` int(11) default NULL,\n `filmCountry` text collate cp1251_general_cs,\n `filmReggiser` text collate cp1251_general_cs,\n `filmActor1` text collate cp1251_general_cs,\n `filmActor2` text collate cp1251_general_cs,\n `filmActor3` text collate cp1251_general_cs,\n `filmSpecial` text collate cp1251_general_cs,\n `filmDvdnumber` text collate cp1251_general_cs,\n `filmDescr` text collate cp1251_general_cs,\n `filmSdescr` text collate cp1251_general_cs,\n `filmPrim` text collate cp1251_general_cs,\n `filmKksize` int(11) default NULL,\n `filmSizedvd9` int(11) default NULL\n) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs

2 запрос: таблица->sql->результат
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

Скрипт ~6кб (файл), не думаю, что в нем, т.к. на прежнем хостинге то работал, однако Вам виднее, одну минуту.

<?}//$parse!="go"








if($parse=="go"){

if(move_uploaded_file($_FILES['f']['tmp_name'],"/tmp/temp.csv"))
{echo "<p>файл успешно загружен</p>!";}
else {die("ошибка с загрузкой файла");}


mysql_query("DELETE FROM kino_films WHERE filmType='$type'");


$fp = fopen ("/tmp/temp.csv","r");

$r = 1;

while ($data = fgetcsv ($fp, 3000, ";")) {

if($data[0]>0){

while (list ($key, $val) = each ($data)) {
$data[$key]=str_replace("'","\&rsquo;",$data[$key]);
$data[$key]=trim($data[$key]);
}

if($type=="mpeg4"){
$cell["filmID"]=$data[0];
$cell["filmName"]=$data[1];
$cell["filmOname"]=$data[2];
$cell["filmTranslate"]=$data[3];
$cell["filmTime"]=$data[4];
$cell["filmSize"]=$data[5];
$cell["filmScreen"]=$data[6];
$cell["filmGenre"]=$data[7];
$cell["filmYear"]=$data[8];
$cell["filmCountry"]=$data[9];
$cell["filmReggiser"]=$data[10];
$people=$data[11];
$cell["filmDescr"]=$data[12];
$cell["filmSpecial"]=$data[13];
$cell["filmDvdnumber"]=$data[14];
}

if($type=="dvd"){
$cell["filmID"]=$data[0];
$cell["filmName"]=$data[1];
$cell["filmOname"]=$data[2];
$cell["filmTranslate"]=$data[3];
$cell["filmTime"]=$data[4];
$cell["filmSize"]=$data[5];
$cell["filmScreen"]=$data[13];
$cell["filmGenre"]=$data[6];
$cell["filmYear"]=$data[7];
$cell["filmCountry"]=$data[8];
$cell["filmReggiser"]=$data[9];
$people=$data[10];
$cell["filmDescr"]=$data[11];
$cell["filmSpecial"]=$data[12];
$cell["filmDvdnumber"]="";
$cell["filmPrim"]=$data[13];
}

if($type=="hdtv"){
$cell["filmID"]=$data[0];
$cell["filmName"]=$data[1];
$cell["filmOname"]=$data[2];
$cell["filmTranslate"]=$data[3];
$cell["filmTime"]=$data[4];
$cell["filmSize"]=$data[5];
$cell["filmScreen"]=$data[6];
$cell["filmGenre"]=$data[7];
$cell["filmYear"]=$data[8];
$cell["filmCountry"]=$data[9];
$cell["filmReggiser"]=$data[10];
$people=$data[11];
$cell["filmDescr"]=$data[12];
$cell["filmSpecial"]=$data[13];
$cell["filmDvdnumber"]="";
$cell["filmPrim"]=$data[14];
}

$sententes=explode(". ",$cell["filmDescr"]);

$best=300;
$descr=$sententes[0];

if(strlen($descr< 150) ){

for($i=1;$len>$best;$i++){

$descr.=$sententes[$i];
$len=strlen($descr);

}
}

$cell["filmSdescr"]=$descr;

$actor=explode(",",$people);
$actor1=trim($actor[0]);
$actor2=trim($actor[1]);
$actor3=trim($actor[2]);




if($type=="mpeg4"){

$genres[$cell["filmGenre"]]++;
$countries[$cell["filmCountry"]]++;
$years[$cell["filmYear"]]++;

$sql="
INSERT INTO `kino_films` (`filmID`, `filmType`, `filmName`, `filmOname`, `filmTranslate`, `filmTime`, `filmSize`, `filmScreen`, `filmGenre`, `filmYear`, `filmCountry`, `filmReggiser`, `filmActor1`, `filmActor2`, `filmActor3`, `filmSpecial`, `filmDvdnumber`, `filmDescr`, `filmSdescr`,`filmPrim`)
VALUES ('".$cell["filmID"]."', '".$type."', '".$cell["filmName"]."', '".$cell["filmOname"]."', '".$cell["filmTranslate"]."', '".$cell["filmTime"]."', '".$cell["filmSize"]."', '".$cell["filmScreen"]."', '".$cell["filmGenre"]."', '".$cell["filmYear"]."', '".$cell["filmCountry"]."', '".$cell["filmReggiser"]."', '".$actor1."', '".$actor2."', '".$actor3."', '".$cell["filmSpecial"]."', '".$cell["filmDvdnumber"]."', '".$cell["filmDescr"]."', '".$cell["filmSdescr"]."', '".$cell["filmPrim"]."');
";
}

if($type=="dvd"){
$genres[$cell["filmGenre"]]++;
$countries[$cell["filmCountry"]]++;
$years[$cell["filmYear"]]++;
$sql="
INSERT INTO `kino_films` (`filmID`, `filmType`, `filmName`, `filmOname`, `filmTranslate`, `filmTime`, `filmSize`, `filmScreen`, `filmGenre`, `filmYear`, `filmCountry`, `filmReggiser`, `filmActor1`, `filmActor2`, `filmActor3`, `filmSpecial`, `filmDvdnumber`, `filmDescr`, `filmSdescr`,`filmPrim`)
VALUES ('".$cell["filmID"]."', '".$type."', '".$cell["filmName"]."', '".$cell["filmOname"]."', '".$cell["filmTranslate"]."', '".$cell["filmTime"]."', '".$cell["filmSize"]."', '".$cell["filmScreen"]."', '".$cell["filmGenre"]."', '".$cell["filmYear"]."', '".$cell["filmCountry"]."', '".$cell["filmReggiser"]."', '".$actor1."', '".$actor2."', '".$actor3."', '".$cell["filmSpecial"]."', '".$cell["filmDvdnumber"]."', '".$cell["filmDescr"]."', '".$cell["filmSdescr"]."', '".$cell["filmPrim"]."');
";

}

if($type=="hdtv"){
$genres[$cell["filmGenre"]]++;
$countries[$cell["filmCountry"]]++;
$years[$cell["filmYear"]]++;
$sql="
INSERT INTO `kino_films` (`filmID`, `filmType`, `filmName`, `filmOname`, `filmTranslate`, `filmTime`, `filmSize`, `filmScreen`, `filmGenre`, `filmYear`, `filmCountry`, `filmReggiser`, `filmActor1`, `filmActor2`, `filmActor3`, `filmSpecial`, `filmDvdnumber`, `filmDescr`, `filmSdescr`,`filmPrim`)
VALUES ('".$cell["filmID"]."', '".$type."', '".$cell["filmName"]."', '".$cell["filmOname"]."', '".$cell["filmTranslate"]."', '".$cell["filmTime"]."', '".$cell["filmSize"]."', '".$cell["filmScreen"]."', '".$cell["filmGenre"]."', '".$cell["filmYear"]."', '".$cell["filmCountry"]."', '".$cell["filmReggiser"]."', '".$actor1."', '".$actor2."', '".$actor3."', '".$cell["filmSpecial"]."', '".$cell["filmDvdnumber"]."', '".$cell["filmDescr"]."', '".$cell["filmSdescr"]."', '".$cell["filmPrim"]."');
";

}

if(!mysql_query($sql)) {print "<h5>Ошибка!<br>".mysql_error()."</h5>"; print "<p>$sql</p>";}

}//$DATA!=0
}//while


mysql_query("DELETE FROM kino_genres WHERE genreType='$type'");
mysql_query("DELETE FROM kino_countries WHERE countryType='$type'");
mysql_query("DELETE FROM kino_years WHERE yearType='$type'");

while (list ($gkey, $gval) = each ($genres)) {
if(strlen($gkey)>3){
$gval=trim($gval);
mysql_query("INSERT INTO `kino_genres` (`genreName`, `genreType`, `genreCount`) VALUES ('".$gkey."', '".$type."', '".$gval."')");
}
}

while (list ($ckey, $cval) = each ($countries)) {
if(strlen($ckey)>3){
$cval=trim($cval);
mysql_query("INSERT INTO `kino_countries` (`countryName`, `countryType`, `countryCount`) VALUES ('".$ckey."', '".$type."', '".$cval."')");
}
}

while (list ($ykey, $yval) = each ($years)) {
$yval=trim($yval);
if( strlen($ykey)<5 && strlen($ykey)>1){
mysql_query("INSERT INTO `kino_years` (`yearName`, `yearType`, `yearCount`) VALUES ('".$ykey."', '".$type."', '".$yval."')");
}
}


echo"<pre>";
//print_r($genres);
echo"</pre>";

}//$parse=="go"?>

Кстати, на старом хостинге, где эта часть кода (см. ниже), все работало в таком виде (без слеша перед путем). На новом только со слешем, иначе "ошибка с загрузкой файла". Не знаю, может это чем-то поможет. Единственное, что сюда было добавлено по сравнению со старым хостингом - 2 этих слеша перед путем.
--------------------
if(move_uploaded_file($_FILES['f']['tmp_name'],"tmp/temp.csv"))
{echo "<p>файл успешно загружен</p>!";}
else {die("ошибка с загрузкой файла");}


mysql_query("DELETE FROM kino_films WHERE filmType='$type'");


$fp = fopen ("tmp/temp.csv","r");
----------------------

  Ответить  
 
 автор: Лена   (26.02.2010 в 15:03)   письмо автору
 
   для: Nice   (26.02.2010 в 14:34)
 

character_set_connection utf8 - может быть, в этом дело.

Ищете файл, который делает подключение к серверу баз.
Там после подключения к базе(искать эту строку - mysql_select_db), надо прописать строки:

mysql_query ("SET NAMES ='cp1251');
mysql_query("set character_set_client ='cp1251');
mysql_query("set character_set_results ='cp1251');
mysql_query("set collation_connection ='cp1251');

  Ответить  
 
 автор: Nice   (26.02.2010 в 15:15)   письмо автору
 
   для: Лена   (26.02.2010 в 15:03)
 

Сайт перестает работать :(

  Ответить  
 
 автор: Лена   (26.02.2010 в 15:56)   письмо автору
 
   для: Nice   (26.02.2010 в 15:15)
 

Быстро писала, кавычки не закрыла.
mysql_query ("SET NAMES ='cp1251'");
mysql_query("set character_set_client ='cp1251'");
mysql_query("set character_set_results ='cp1251'");
mysql_query("set collation_connection ='cp1251'");

  Ответить  
 
 автор: Nice   (26.02.2010 в 16:02)   письмо автору
 
   для: Лена   (26.02.2010 в 15:56)
 

Безрезультатно :(

Делаю все по Вашей инструкции.
1. Зайти на старый сервер возможности нет, смотрим в какой кодировке сам дамп. Таблицы в DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs;
2. Заходим на сервер новой базы, там cp1251_general_ci, меняем на cp1251_general_cs.
3. На новом сервере уже есть таблицы с данными. Все таблицы, в которые скрипт добавляет данные, в cp1251_general_cs
4. mysql_query ("SET NAMES ='cp1251'");
mysql_query("set character_set_client ='cp1251'");
mysql_query("set character_set_results ='cp1251'");
mysql_query("set collation_connection ='cp1251'"); добавлено

Результата нет, как криво добавлялось, так и добавляется :(

  Ответить  
 
 автор: Nice   (05.03.2010 в 12:55)   письмо автору
 
   для: Лена   (26.02.2010 в 15:56)
 

Спасибо за работу со мной, копали не в том направлении. Проблема была у хостера, которая справлена внесением изменений в скрипт.

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

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