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

Форум MySQL

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

 

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

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

тема: Проблема: Срезается русский текст
 
 автор: codexomega   (09.10.2005 в 07:59)   письмо автору
 
 

В локальной сети все работает как надо. Установлен MySQL 4.1.13 и phpMyAdmin 2.6.3-pl1. БД с кодировкой utf8-unicode.
На буржуйском хостинге находится зеркало моего сайта, на котором я поставил статьи. Статьи (заголовок, текст и источник) выводятся из БД MySQL 4.0.25. Кодировками я на хостинге через phpMyAdmin управлять не могу и какая там кодировка стоит по умолчанию, мне не известно, но наверное western.
Загрузил значит я в ихнию БД dump. Открываю страницу со статьями на сайте, вижу русские буквы, как положенно, но со срезанным текстом:(

Это список статей на локалке:

Древний Рецепт Омоложения 
Теософская Сказка О Зеркалах 


А это на хостинге:

Древний Рецепт Омоложен& 
Теософская Сказка О Зерк 


Локалка:

Сергей Матвееф (Магия Денег)


Хостинг:

Сергей Матвееф (Магия Ден


Самое интресное, что срезаются поля varchar(150), тогда как текст статьи(text)выглядит нормально.
Что делать и в чем проблема?

   
 
 автор: codexomega   (09.10.2005 в 14:23)   письмо автору
 
   для: codexomega   (09.10.2005 в 07:59)
 

Короче понял проблему, если кто с с подобным столкнется, будете умнее.
Оказалось что вот это по русски: Древний Рецепт Омоложения
На языке чуждой кодировки переводится вот так:

Древний Рецепт Омоложени&#1103


Естественно длины поля не хватает, значит надо зарезервировать больше места.
Вместо varchar(150 )я поставил varchar(500).

   
 
 автор: cheops   (09.10.2005 в 14:27)   письмо автору
 
   для: codexomega   (09.10.2005 в 14:23)
 

Это - phpMyAdmin, когда не выбрана русская кодировка - он русские буквы в HTML-аналоги преобразует. Лучше загрузите дамп на сервер через FTP и перебросте его при помощи PHP. В любом случае в таком виде лучше не выводить - будут проблемы с поисковыми роботами. Для того, чтобы обратно преобразовать HTML-последовательности в русский текст, необходимо использовать функцию html_entity_decode().

   
 
 автор: codexomega   (09.10.2005 в 14:40)   письмо автору
 
   для: cheops   (09.10.2005 в 14:27)
 

Функция html_entity_decode() служит для того чтобы текст из дампа перекодировать или же из БД на страницу?
Дело в том что в дампе у меня кириллица.

   
 
 автор: cheops   (09.10.2005 в 14:52)   письмо автору
 
   для: codexomega   (09.10.2005 в 14:40)
 

Эта функция перекодирует текст вида
Древний Рецепт Омоложени&#1103

в
Древний Рецепт Омоложения

Если вы примете решение хранить в базе текст в виде HTML-символов, то перед выводом лучше пропускать их через эту функцию.

   
 
 автор: codexomega   (09.10.2005 в 15:10)   письмо автору
 
   для: cheops   (09.10.2005 в 14:52)
 

Хорошо, ну а если я хочу чтобы у меня в phpMyAdmin был русский текст а не абракадабра что мне делать, iconv()использовать и вообще получится ли если база в латинской кодировке?

   
 
 автор: cheops   (09.10.2005 в 21:41)   письмо автору
 
   для: codexomega   (09.10.2005 в 15:10)
 

После того, как тест засобачен в базу данных при помощи phpMyAdmin и обезображен им - необходимо при помощи UPDATE из PHP скрипта пройтись этой функцией по всей базе и преобразовать HTML-представления в обычные символы - iconv() тут бессилен, так как смены кодировки не происходит - происходит кодирование в HTML-символы.

   
 
 автор: codexomega   (09.10.2005 в 21:59)   письмо автору
 
   для: cheops   (09.10.2005 в 21:41)
 

Хорошо, это тоже понятно. И послужит только в том случае если мне надо переконвертировать имеющиеся данные. А как поступать с новыми, чтобы они сразу записывались как надо?
Раннее упомянулось о переброске дампа средствами PHP, это как?

   
 
 автор: cheops   (09.10.2005 в 22:13)   письмо автору
 
   для: codexomega   (09.10.2005 в 21:59)
 

1) Если новые данные будут идти не через phpMyAdmin - они будут записываться без искажений.
2) Перебросить дамп средствами PHP можно при помощи скрипта по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1407 (он не совершенен и бывает сбоит).

   
 
 автор: codexomega   (09.10.2005 в 22:18)   письмо автору
 
   для: cheops   (09.10.2005 в 22:13)
 

Спасибо, попробую.

   
 
 автор: codexomega   (09.10.2005 в 22:48)   письмо автору
 
   для: codexomega   (09.10.2005 в 22:18)
 

Создал новую страницу со скриптом приведенным по ссылке для залития данных через файл.
Поставил файл .sql на сервер.
Ошибок никаких скрипт не выдает, но и выполнятся не хочет. После запуска скрипта база данных остается интактной...

   
 
 автор: cheops   (09.10.2005 в 22:58)   письмо автору
 
   для: codexomega   (09.10.2005 в 22:48)
 

Вообще-то я не посмотрел... там достаточно специфический код... Замените блок
<?php
 
// Разбиваем содержимое файла по точке с запятой 
  
$quer preg_split("|\);\r\n|"$bufer); 
  
// Выполняем SQL-запросы 
  
foreach($quer as $query
  { 
    if(!
mysql_query($query.")")); 
  }
?>

на
<?php
 
// Разбиваем содержимое файла по точке с запятой 
  
$quer preg_split("|;\r\n|"$bufer); 
  
// Выполняем SQL-запросы 
  
foreach($quer as $query
  { 
    if(!
mysql_query($query")); 
  }
?>

А лучше перед тем как выполнять запросы - промоделируйте ситуацию, выведите дамп массива $quer - посмотрите что внутри
<?php
  
echo "<pre>";
  
print_r($quer);
  echo 
"</pre>";
?>

   
 
 автор: codexomega   (09.10.2005 в 23:32)   письмо автору
 
   для: codexomega   (09.10.2005 в 07:59)
 

Содержимое файла отображается, а вот запрос в БД почему-то не происходит.
Ошибок нет.

Array
(
    [0] => -- phpMyAdmin SQL Dump
-- version 2.6.3-pl1
-- http://www.phpmyadmin.net
-- 
-- Host: localhost
-- Generation Time: Oct 09, 2005 at 02:22 PM
-- Server version: 4.1.13
-- PHP Version: 5.0.4
-- 
-- Database: 'client'
-- 

-- --------------------------------------------------------

-- 
-- Table structure for table 'religion_articles'
-- 

CREATE TABLE 'religion_articles' (
  'Article_Id' int(11) NOT NULL auto_increment,
  'Article_Name' varchar(250)  NOT NULL default '',
  'Article_Text' text NOT NULL,
  'Article_Source' varchar(250) default NULL,
  PRIMARY KEY  ('Article_Id')
) ENGINE=MyISAM;

-- 
-- Dumping data for table 'religion_articles'
-- 

INSERT INTO 'religion_articles' VALUES (3, '??????? ?????? ??????????', '????...r\n', NULL);
INSERT INTO 'religion_articles' VALUES (4, '?????.\r\n', '?????? ??????? (????? ?????)' ...);

)



А это скрипт:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Data Dump</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<?php
  
// Адрес базы данных
  
$dblocation "localhost";
  
// Имя базы данных
  
$dbname "xxxx";
  
// Имя пользователя...
  
$dbuser "xxxx";
  
// Пароль
  
$dbpasswd "xxxx";
  
// Соединяемся с сервером базы данных - нужно получить соединение 
  // по которому мы будем отправлять запросы базе данных и получать 
  // ответы (данные или сообщения об успешности выполнения запросов)
  
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
  if (!
$dbcnx)
  {
    echo( 
"<P>No connection.</P>" );
    exit();
  }
 
// Выбираем базу данных - этой функцией мы сообщаем с какой 
  // базой данных мы будем работать, заметте, что вторым 
  // параметром мы передаем дискриптор соединения $dbcnx, 
  // который вернула функция mysql_connect
  
if (! @mysql_select_db($dbname,$dbcnx) )
  {
    echo( 
"<P>No connection.</P>" );
    exit();
  }
  
// Имя файла с SQL-инструкциями
  
$filename "religion_articles.sql";
  
// открываем его и читаем в буфер
  
      
$fp fopen($filename"r");
      
$bufer fread($fp,filesize($filename));
      
fclose($fp);
      
// // Разбиваем содержимое файла по точке с запятой
     
$quer preg_split("|;\r\n|"$bufer); 
    echo 
"<pre>"
      
print_r($quer); 
      echo 
"</pre>";
    if(isset(
$_POST['submit')){
          
//  Выполняем SQL-запросы
          
foreach($quer as $query
          { 
            if(!
mysql_query($query)); 
          } 
      }
?>

</head>

<body>
<h1>Dump Data From SQL FIle</h1>
<form action="data_dump.php" method="post" name="form1">
<h2>Click the button to dump data</h2>
<hr />
<input name="submit" type="submit" value="submit" />
</form>

</body>
</html>



Может я где-то ошибку допустил?

   
 
 автор: cheops   (10.10.2005 в 00:34)   письмо автору
 
   для: codexomega   (09.10.2005 в 23:32)
 

1) Удалите из дампа все комментарии, которые начинаются на --
2) Исправьте регулярное выражение на
<?php
    $quer 
preg_split("|;[\s]*\r\n|"$bufer); 
?>

там в конце каждого выражения пробел идёт...
3) В строке
<?php
   
if(isset($_POST['submit')){
?>

у вас пропущена квадратная скобка ]

   
 
 автор: codexomega   (10.10.2005 в 00:58)   письмо автору
 
   для: cheops   (10.10.2005 в 00:34)
 

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

   
 
 автор: cheops   (10.10.2005 в 14:46)   письмо автору
 
   для: codexomega   (10.10.2005 в 00:58)
 

А сколько элементов в массиве получается?

   
 
 автор: codexomega   (10.10.2005 в 19:52)   письмо автору
 
   для: cheops   (10.10.2005 в 14:46)
 

Прошу прощения за несмышленность, в каком массиве?
В том что идет цикл for each?
Почему то всего один.

И вообще меня смущает данная инструкция.


          foreach($quer as $query) 
          { 
            if(!mysql_query($query)); 
          } 


Она ничего не делает.
В файле .sql можно написать все что угодно и неправильный синтаксис поставить и всякую абракадабру написать, инструкция к нему даже не обращается и в результате ничего не происходит.

   
 
 автор: cheops   (10.10.2005 в 21:34)   письмо автору
 
   для: codexomega   (10.10.2005 в 19:52)
 

Хм... как раз лабуды в файле и не должно быть :))) там должны быть только SQL-запросы.

   
 
 автор: codexomega   (10.10.2005 в 21:40)   письмо автору
 
   для: cheops   (10.10.2005 в 21:34)
 

Это я понимаю.
У меня в файле и есть только SQL запросы без всяких лишних коментариев и с корректным синтаксисом.
Но если я нарошно, ради теста напишу в файле вякую ерунду, мне же не выдается никакая ошибка.
А запрос вообще, даже самый правильный не выполняется.
С чем связано?

   
 
 автор: codexomega   (10.10.2005 в 22:59)   письмо автору
 
   для: codexomega   (10.10.2005 в 19:52)
 

Поламов немного голову, я поставил в код вывод ошибки в случае неправильного запроса. Не знаю, почему раньше этого не сделал.
Короче первое что я сделал, так это удалил кавычки из запроса, в которые было заключено название таблицы.
Все пошло как надо. Ура!
Странно, но я такое уже делал вчера, но у меня оно не заработало.
Наверное тут еще и код был виноват.
Теперь он у меня такой:

          foreach($quer as $query)
          {
            if(!mysql_query($query))
                exit("Error - ".mysql_error());

          }



А это мой запрос в файле .sql:


INSERT INTO religion_articles VALUES ('', 'ABC','123', NULL);
INSERT INTO religion_articles VALUES ('', 'XY23','456', NULL);


Большое спасибо за помощь.
Осталось проверить на хосте, будет ли выполнятся все правильно и вместо значков html, увижу ли я в моей БД буквы.

   
 
 автор: codexomega   (11.10.2005 в 09:02)   письмо автору
 
   для: codexomega   (10.10.2005 в 22:59)
 

На хосте проверил. Но теперь вместо htmlосвких значков знаки вопроса.
Дело в том что файл .sql никак не принимается той системой и не расшивровывается, в коде ASCII не хватает значений.
Вообщем я решил не крутить мозги и воспользоваться взамен функцией html_entity_decode().
Проверю что получится.

   
 
 автор: cheops   (11.10.2005 в 15:05)   письмо автору
 
   для: codexomega   (11.10.2005 в 09:02)
 

А на хосте версия MySQL какая?

   
 
 автор: codexomega   (11.10.2005 в 16:41)   письмо автору
 
   для: cheops   (11.10.2005 в 15:05)
 

4.0.25
Но дело наверное не в версии.
У меня тоже ни фига не идет с MySQL 4.1 на английском OS
Я попробовал редактировать sql файл в блокноте. При сохранении, блокнот выдает что в файле содержатся элементы unicode и если я не хочу потерять формат, то должен сохранить как unicode.
Сохраняю.
Запускаю скрипт.
Теперь данные в формате unicode, но синтаксическая ошибка:

(
Array
(
    [0] => INSERT INTO religion_articles VALUES ('', 'Статья первая','Текст статьи', NULL);
)
Error - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO religion_articles VALUES ('', 'Статья первая','Тек' at line 1


Может там какие-то дополнительные спрятанные кодировки прибавляются, которых в тексте не видно?

   
 
 автор: cheops   (11.10.2005 в 23:41)   письмо автору
 
   для: codexomega   (11.10.2005 в 16:41)
 

Вы при сохранении данных в блокноте в последнем выпадающем списке что выбираете ANSI или Юникод?

   
 
 автор: codexomega   (12.10.2005 в 00:05)   письмо автору
 
   для: cheops   (11.10.2005 в 23:41)
 

Юникод, потому что в ANSI теряется кодировка букв и получаются знаки вопроса, которые ничем нельзя расшивровать.

   
 
 автор: codexomega   (12.10.2005 в 22:48)   письмо автору
 
   для: codexomega   (09.10.2005 в 07:59)
 

Вообщем так.
Поставлю я лучше форму на хост и буду через нее записи вставлять в таблицу.
Ведь таким образом данные не проходят обработку в phpMyAdmin.
Так будет проще.
Надоело возится с этими sql файлами.

   
 
 автор: codexomega   (15.10.2005 в 18:45)   письмо автору
 
   для: codexomega   (12.10.2005 в 22:48)
 

Создал форму для SQL запросов, содержащую текстовое поле и кнопку Submit.
Но теперь проблема с регулярным выражением.
Вот запрос:

INSERT INTO zagovor_category VALUES ('', 'Дела житейские');
INSERT INTO zagovor_category VALUES ('', 'Здоровье');
INSERT INTO zagovor_category VALUES ('', 'Защита');
INSERT INTO zagovor_category VALUES ('', 'Удача');
INSERT INTO zagovor_category VALUES ('', 'Хозяйство');
INSERT INTO zagovor_category VALUES ('', 'Любовь');
INSERT INTO zagovor_category VALUES ('', 'Деньги и богатство');
INSERT INTO zagovor_category VALUES ('', 'Сглаз и порча');
INSERT INTO zagovor_category VALUES ('', 'Все');


Это код PHP:


if(isset($_POST['sql_string']))
      $sql_string=$_POST['sql_string'];
else
      $sql_string="";
if(isset($_POST['submit'])){
     $sql_string_formatted = preg_split("|;[\s]*\r\n|", $sql_string);
    echo "<pre>";
      print_r($sql_string_formatted);
      echo "</pre>";
      foreach($sql_string_formatted as $query)
      {
       if(!mysql_query($query.")"))
           exit("Error - ".mysql_error());
    }
    // show confirmation
    echo 'Your informations were successfully added!';
}



А это результат:


Array
(
    [0] => INSERT INTO zagovor_category VALUES (\'\', \'Дела житейские\')
    [1] => INSERT INTO zagovor_category VALUES (\'\', \'Здоровье\')
    [2] => INSERT INTO zagovor_category VALUES (\'\', \'Защита\')
    [3] => INSERT INTO zagovor_category VALUES (\'\', \'Удача\')
    [4] => INSERT INTO zagovor_category VALUES (\'\', \'Хозяйство\')
    [5] => INSERT INTO zagovor_category VALUES (\'\', \'Любовь\')
    [6] => INSERT INTO zagovor_category VALUES (\'\', \'Деньги и богатство\')
    [7] => INSERT INTO zagovor_category VALUES (\'\', \'Сглаз и порча\')
    [8] => INSERT INTO zagovor_category VALUES (\'\', \'Все\');
)
Error - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'\', \'Дела житейские\'))' at line 1


Запрос из файла вроде работал, а строка не хочет.
Что здесь не так?
Спасибо.

   
 
 автор: cheops   (16.10.2005 в 15:26)   письмо автору
 
   для: codexomega   (15.10.2005 в 18:45)
 

Пропустите запрос через stripslashes()
<?php
if(isset($_POST['sql_string'])) 
      
$sql_string=$_POST['sql_string']; 
else 
      
$sql_string=""
if(isset(
$_POST['submit'])){ 
    
$sql_string_formatted preg_split("|;[\s]*\r\n|"$sql_string); 
    echo 
"<pre>"
      
print_r($sql_string_formatted); 
      echo 
"</pre>"
      foreach(
$sql_string_formatted as $query
      { 
       if(!
mysql_query(stripslashes($query).")")) 
           exit(
"Error - ".mysql_error()); 
    } 
    
// show confirmation 
    
echo 'Your informations were successfully added!'
}
?>

   
 
 автор: codexomega   (16.10.2005 в 20:11)   письмо автору
 
   для: cheops   (16.10.2005 в 15:26)
 

Большое спасибо cheops!
Наконец-то моя проблема решена.
В БД записывается текст вместо знаков HTML.
Правда в последнем сообщении, в коде я допустил ошибку, добавил лишнюю скобку.
if(!mysql_query(stripslashes($query).")"))


Вот исправленный код который работает, если кому еще понадобится:

<?php
// Insert data
if(isset($_POST['sql_string'])) 
      
$sql_string=$_POST['sql_string']; 
else 
      
$sql_string=""
if(isset(
$_POST['submit'])){ 
    
$sql_string_formatted preg_split("|;[\s]*\r\n|"$sql_string); 
    echo 
"<pre>"
      
print_r($sql_string_formatted); 
    echo 
"</pre>"
    foreach(
$sql_string_formatted as $query
    { 
       if(!
mysql_query(stripslashes($query))) 
           exit(
"Error - ".mysql_error()); 
    } 
    
// show confirmation 
    
echo 'Your informations were successfully added!'
}
?>

   
Rambler's Top100
вверх

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