1

Тема: Не отображаются данные типа TEXT

Установил локальный сервер Endels. При загрузке на сайт данных из БД текст типа VARCHAR отображается, текст типа TEXT нет. Остаётся пустое место. Все остальное отображается нормально. Сайт на старом Денвере работал нормально. Подскажите решение проблемы. Кодировка русская ср 1251.

2

Re: Не отображаются данные типа TEXT

Максимальная длина данных для типа TEXT составляет 65536 символов для кодировки cp1251. Посмотрите длину строк. Так же проверьте что именно в полях в БД.

3

Re: Не отображаются данные типа TEXT

Спасибо за ответ! Большим специалистом в этой области не являюсь, но так как приходится время от времени настраивать сайт пришлось ставить локальный сервер типа старого доброго Денвера на Windows 7. В связи с этим и появились эти проблемы. Что касается отображения данных типа TEXT, то я менял свойство на VARCHAR, что естественно ничего не изменило. Основу проблемы вроде бы понял - это не соответствие версий базы данных сайта libmysql 5.01.51 a и версии сервера mysql 5.5.3, а также возможно разных версий PHP. Хотя у провайдера всё работает, значит настроить можно. Но там специалисты. Так что придётся наращивать знания в этой области и искать решение.

4

Re: Не отображаются данные типа TEXT

Проблему вроде бы выявил. Заключается в следующем: для обработки данных из столбцов таблицы БД типа TEXT в скрипте страницы добавил пользовательскую функцию

function format_text ($text) {
  $result = htmlspecialchars($text);
  $result = str_replace("\r\n","<br>",$result);
  $result = str_replace("","<b>",$result);
  $result = str_replace("
","</b>",$result);
  $result = str_replace("","<i>",$result);
  $result = str_replace("
","</i>",$result);
  $result = str_replace("[a href=']","<a href='",$result);
  $result = str_replace("[']","'>",$result);
  $result = str_replace("['nwin]","' target='_blank'>",$result);
  $result = str_replace("[/a]","</a>",$result);
  $result = str_replace("[p]","<b class=\"pgrm\">",$result);
  $result = str_replace("[/p]","</b>",$result);
  $result = str_replace ("|-","&ndash;",$result);
  $result = str_replace ("[q]","&raquo;",$result);
  $result = str_replace ("[/q]","&laquo;",$result);
  $result = str_replace ("[qs]","&rsaquo;",$result);
  $result = str_replace ("[/qs]","&lsaquo;",$result);
  $result = str_replace ("|'","&rsquo;",$result);
  return $result;
}

в новых версиях PHP htmlspecialchars имеет кодировку по умолчанию ISO-8859-1, поэтому добавили необязательный аргумент с кодировкой.
Теперь записываю строку следующим образом

$result = htmlspecialchars($text,windows-1251);

в результате на странице появились только выражения на английском и спецсимволы. Русский текст по прежнему не отображается.
P.S. Если в скрипте убрать вышеуказанную пользовательскую функцию все работает, правда теперь невозможно ввести с админстраницы ссылки, наклоный и жирный текст. Разбираюсь дальше.

5

Re: Не отображаются данные типа TEXT

Drm сказал:

$result = htmlspecialchars($text,windows-1251);

Закройте строку кодировки в кавычки.

$result = htmlspecialchars($text, "windows-1251");

6

Re: Не отображаются данные типа TEXT

Пробовал закрыть в кавычки, выдает ошибку. Судя по описанию функции htmlspecialchars правильный синтаксис без кавычек. Добавил в скрипт страницы, в одном из мест где выводится отформатированый указаной в предыдущем посте функцией текст, дополнительный скрипт для проверки входящей и выходящей кодировки:

<?= format_text($content);var_dump(iconv_get_encoding('all'));?>

, результат

array(3) { ["input_encoding"]=> string(10) "ISO-8859-1" ["output_encoding"]=> string(12) "ISO-8859-1" ["internal_encoding"]=> string(12) "ISO-8859-1" }

затем добавил в пользовательскую функцию следующие строки

function format_text ($text) {
iconv_set_encoding("internal_encoding", "WINDOWS-1251");
  iconv_set_encoding("output_encoding", "WINDOWS-1251");
  $result = htmlspecialchars($text, WINDOWS-1251);
  $result = str_replace("\r\n","<br>",$result);
  $result = str_replace("","<b>",$result);
  $result = str_replace("
","</b>",$result);
  $result = str_replace("","<i>",$result);
  $result = str_replace("
","</i>",$result);
  $result = str_replace("[a href=']","<a href='",$result);
  $result = str_replace("[']","'>",$result);
  $result = str_replace("['nwin]","' target='_blank'>",$result);
  $result = str_replace("[/a]","</a>",$result);
  $result = str_replace("[p]","<b class=\"pgrm\">",$result);
  $result = str_replace("[/p]","</b>",$result);
  $result = str_replace ("|-","&ndash;",$result);
  $result = str_replace ("[q]","&raquo;",$result);
  $result = str_replace ("[/q]","&laquo;",$result);
  $result = str_replace ("[qs]","&rsaquo;",$result);
  $result = str_replace ("[/qs]","&lsaquo;",$result);
  $result = str_replace ("|'","&rsquo;",$result);
  return $result;
}

в результате кодировки поменялись

array(3) { ["input_encoding"]=> string(10) "ISO-8859-1" ["output_encoding"]=> string(12) "WINDOWS-1251" ["internal_encoding"]=> string(12) "WINDOWS-1251" }

но по прежнему русский текст не выводится.
Замена аргумента в функции htmlspecialchars($text, WINDOWS-1251) на другие кодировки типа ISO-8859-5 (от1до 15), UTF-8 приводит к тому, что на странице появляются "кракозябры", либо только английский текст с цифрами и знаками, в  ISO-8859-5 ещё появляются правильно отформатированые ссылки.

7

Re: Не отображаются данные типа TEXT

Посмотрите как кириллица выглядит в phpMyAdmin и какая кодировка стоит на поле таблицы.

Оставьте функцию htmlspecialchars() с одним параметром. Думаю проблема не в ней, к тому же вы неверно указали параметр кодировки, он должен идти третьим, а не вторым.

8

Re: Не отображаются данные типа TEXT

Кирилица в PHPmyadmin отображается нормально. Кодировка поля cp1251_general_ci.
В свой скрипт внёс изменения:

function format_text ($text) {
$text = mb_convert_encoding($text,"Windows-1251");
  $result = htmlspecialchars($text);
  $result = str_replace("\r\n","<br>",$result);
  $result = str_replace("","<b>",$result);
  $result = str_replace("
","</b>",$result);
  $result = str_replace("","<i>",$result);
  $result = str_replace("
","</i>",$result);
  $result = str_replace("[a href=']","<a href='",$result);
  $result = str_replace("[']","'>",$result);
  $result = str_replace("['nwin]","' target='_blank'>",$result);
  $result = str_replace("[/a]","</a>",$result);
  $result = str_replace("[p]","<b class=\"pgrm\">",$result);
  $result = str_replace("[/p]","</b>",$result);
  $result = str_replace ("|-","&ndash;",$result);
  $result = str_replace ("[q]","&raquo;",$result);
  $result = str_replace ("[/q]","&laquo;",$result);
  $result = str_replace ("[qs]","&rsaquo;",$result);
  $result = str_replace ("[/qs]","&lsaquo;",$result);
  $result = str_replace ("|'","&rsquo;",$result);
  return $result;
}

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

9

Re: Не отображаются данные типа TEXT

Drm сказал:

вместо русских букв знаки вопроса.

Проверьте в какой кодировке страница скрипта, должна быть ANSI, что можно увидеть в Notepad++, например. Так же проверьте кодировку страниц сайта заданную в метатеге. Если ошибок не найдете, то смотрите функцию подключения к MySQL, mysql_connect и сразу после нее добавьте строку:

mysql_query('SET NAMES cp1251');

10 (изменено: Drm, 2015-07-21 20:01:01)

Re: Не отображаются данные типа TEXT

Кодировка страницы скрипта UTF-8, кодировка страницы windows-1251, добавление строки

mysql_query('SET NAMES cp1251');

ситуацию не меняет. Значит надо перекодировать скрипт в ANSI, если я правильно понял. Попробую перекодировать.
P.S. Notepad++ вообще не показывает в какой кодировки скрипт, включаю вручную ANSI - показывает кракозябры, включаю UTF-8 отображается нормальный русский текст. Перекодировать не получается, не реагирует. Попытался создать новый файл в нужной кодировке, сохранил его пустым. При открытии кодировка меняется на UTF -8, но кодировку можно сменить. Затем стал частями копировать куски из старого скрипта, сохранил. При открытии кодировку перестал показывать, сменить кодировку не получается.

11

Re: Не отображаются данные типа TEXT

Drm сказал:

Notepad++ вообще не показывает в какой кодировки скрипт

Должно показывать в Notepad++ внизу, в статусной строке. Конвертировать кодировку в ANSI можно из меню Кодировки. В чем у вас проблема понять не могу.

12

Re: Не отображаются данные типа TEXT

Понял, спасибо за содействие.