26 (изменено: Hase, 2012-01-08 19:17:03)

Re: Ошибка кодировки.

Так. Что-то опять не получается. Я вручную изменил в БД текст, там он поменялся. Открыл страницу, где скрипт выводит это значение. Кодировка поменялась, но не на кириллицу, а на какую-то другую. Я ввел через страницу вместо этих данных, новые, опять же на кириллице, и опять выпала старая кодировка и изменились данные в mysql. <meta> информацию я вставил. В общем, ошибка. С записью или выводом. А скорее всего и с тем и с другим. Может быть это ошибка на самом сервере?


В данных mysql такая запись: "Телефон", а мне выводится ’Ґ«Ґд®, хотя в это время (я проверил) в БД запись не деформировалась.

27

Re: Ошибка кодировки.

Попробуйте в корне хоста создать файл .htaccess и добавить в него строку:

PHP_VALUE default_charset windows-1251

Сейчас важно сделать так, чтобы кириллица выводимая в phpMyAdmin так же выводилась и в скрипте. Если вы изменяете данные MySQL через консоль, то кодировку cp1251 сохранить не сможете, потому что кодировка консоли cp866. Поэтому обязательно установите phpMyAdmin.

28

Re: Ошибка кодировки.

Сейчас важно сделать так, чтобы кириллица выводимая в phpMyAdmin так же выводилась и в скрипте. Если вы изменяете данные MySQL через консоль, то кодировку cp1251 сохранить не сможете, потому что кодировка консоли cp866. Поэтому обязательно установите phpMyAdmin.

phpmyadmin есть, файл создал, данные изменял через консоль

29

Re: Ошибка кодировки.

А может это быть настройки в сервере? Я использую денвер, может это он "чудит"?

30

Re: Ошибка кодировки.

Hase сказал:

А может это быть настройки в сервере? Я использую денвер, может это он "чудит"?

Вы же писали, что меняли данные через консоль, при этом никаким образом кодировка не могла быть cp1251, значит ошибка именно в этом. Просто поменяйте данные в phpMyAdmin и никаких проблем не будет.

31

Re: Ошибка кодировки.

Спасибо огромное! Вы мне очень помогли!

32 (изменено: Hase, 2012-01-26 20:44:01)

Re: Ошибка кодировки.

Опять возвращаюсь к этой теме. Я установил сервер, и опять кодировка ни к черту. В phpmyadmin такая информация: MySQL-кодировка: UTF-8 Unicode (utf8);
Сопоставление соединения с MySQL :  cp1251_bin;
В интересующей меня таблице бд стоит сравнение cp1251_bin...
Все что вы мне здесь писали не помогает...
Прошу помочь...
neutral

В phpmyadmin тоже кракозябру выдает вместо кириллицы...
Но только после того, как скрипт прошел через браузер... Если не запускать, то кодировка не изменяется, если запустить, то все летит neutral

33

Re: Ошибка кодировки.

Hase сказал:

В интересующей меня таблице бд стоит сравнение cp1251_bin

Это бинарное сравнение для хранения двоичных данных.

Если в phpMyAdmin вы видите крякозыбры - значит именно они и записаны в БД, следовательно скриптом их вывести можно только в виде крякозябров.

Покажите скрипт, который записывает данные в БД.

34

Re: Ошибка кодировки.

Hanut сказал:

Если в phpMyAdmin вы видите крякозыбры - значит именно они и записаны в БД, следовательно скриптом их вывести можно только в виде крякозябров.

Если вводить информацию через phpmyadmin, то кодировка сохраняется как cp1251, и остается до тех пор пока я не пропускаю скрипт работы с этой таблицей через браузер. Скрипт записи и вывода такой:


<?php
include_once 'functions.php';
if(!isset($_SESSION['user']))
   die("<br><br>Вы обязаны войти на сайт, чтобы просматривать эту страницу");
$user = $_SESSION['user'];
echo "<h3>Редактирование вашего профиля</h3>";
if(isset($_POST['text']))
{
$text = sanitizeString($_POST['text']);
$text = preg_replace('/\s\s+/', ' ', $text);
$query = "SELECT * FROM profiles WHERE user='$user'";
if (mysql_num_rows(queryMysql($query)))
{
  queryMysql("UPDATE profiles SET text='$text' where user='$user'");
}
else
{
  $query = "INSERT INTO profiles VALUES('$user','$text')";
  queryMysql($query);
}
}
else
{
$query = "SELECT * FROM profiles WHERE user='$user'";
$result = queryMysql($query);
if(mysql_num_rows($result))
{
  $row = mysql_fetch_row($result);
  $text = stripslashes($row[1]);
}
else $text = "";
}
$text = stripslashes(preg_replace('/\s\s+/', ' ', $text));
if(isset($_FILES['image']['name']))
{
$saveto = "userimg/$user.jpg";
move_uploaded_file($_FILES['image']['tmp_name'], $saveto);
$typeok = true;
switch($_FILES['image']['type'])
{
  case "image/gif": $src = imagecreatefromgif($saveto); break;
  case "image/jpeg": $src = imagecreatefromjpeg($saveto); break;
  case "image/png": $src = imagecreatefrompng($saveto); break;
  default: $typeok = false; break;
}
if($typeok)
{
  list($w, $h) = getimagesize($saveto);
  $max = 100;
  $tw = $w;
  $th = $h;
  if($w > $h && $max < $h)
  {
   $th = $max / $w * $h;
   $tw = $max;
  }
  elseif ($h > $w && $max < $h)
  {
   $tw = $max / $h * $w;
   $th = $max;
  }
  elseif ($max < $w)
  {
   $tw = $th = $max;
  }
  $tmp = imagecreatetruecolor($tw, $th);
  imagecopyresampled($tmp, $src,0, 0, 0, 0, $tw, $th, $w, $h);
  imageconvolution($tmp, array ( // улучшение резкости изображения
                         array(-1, -1, -1),
                         array(-1, 16, -1),
                         array(-1, -1, -1)
                         ), 8, 0);
  imagejpeg($tmp, $saveto);
  imagedestroy($tmp);
  imagedestroy($src);
}
}
echo <<<_END
<script>
function preview()
{
if(document.getElementById('showprofile').style.display == 'none'){
document.getElementById('showprofile').style.display = 'block';
}else{
document.getElementById('showprofile').style.display = 'none';
}
}
</script>
<form method='post' action='myprofile.php' enctype='multipart/form-data'>
Введите или отредактируйте сведения и загрузите изображение.<br>
<textarea name='text' cols='40' rows='3'>$text</textarea><br>
<br>
Изображение: <input type='file' name='image' size='14' maxlength='32'>
<input type='submit' value='Сохранить информацию'>
</form>
<br><br>
<hr style='width: 98%; float:left;'>
<br>
<img src='images/preview.png' onmouseover='this.src="images/preview2.png"' onmouseout='this.src="images/preview.png"' onclick="preview()">
<br>
<hr style='width: 98%; float:left;'>
<div id="showprofile">
_END;
showProfile($user);
echo "</div>";
?>


<?php //functions.php
header('Content-Type: text/html; charset=cp1251');
require 'login.php';
$appname = "Class105";
mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error());
mysql_query('SET NAMES cp1251');
mysql_query("SET CHARACTER SET 'cp1251'");
mysql_select_db($dbname) or die (mysql_error());
function sanitizeString($var) // уничтожает потенциально вредоносный код и теги из информации введенной пользователем
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}

function showProfile($user) //отображает миниатюрные аватары пользователей и краткую информацию "Обо мне", если таковая имеется
{
if (file_exists("userimg/$user.jpg"))
     echo "<img src='userimg/$user.jpg' border='1' align='left'>";
$result = queryMysql("SELECT * FROM profiles WHERE user='$user'");
if (mysql_num_rows($result))
{
  $row = mysql_fetch_row($result);
  echo stripslashes($row[1]) . "<br clear=left><br>";
}
}
?>

35

Re: Ошибка кодировки.

Если скрипт запускается под root, то создайте отдельного пользователя и наделите его необходимыми правами исключая те, что находятся в разделе "Администрирование".

36

Re: Ошибка кодировки.

Так. Сделал. Ничего не изменилось. Кстати, заметил, что кодировка меняется только при замене значения из браузера, если просто его выводить (предварительно изменив в phpmyadmin, то даже в браузере выводится все нормально...

37

Re: Ошибка кодировки.

Попробуйте в скрипте посмотреть в каком виде данные передаются в MySQL. Возможно они уже записываются в искаженном виде.

Покажите конфигурационный файл MySQL (my.ini).

38

Re: Ошибка кодировки.

[client]
port=3306
character-sets-dir="D:/WebServer/mysql/share/charsets"
[mysql]
default-character-set=cp1251
[mysqld]
port=3306
character-sets-dir="D:/WebServer/mysql/share/charsets"
init-connect="SET NAMES cp1251"
basedir="D:/WebServer/mysql/"
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
character-set-server=cp1251
default-storage-engine=MYISAM
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=0
table_cache=256
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=35M
key_buffer_size=25M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=47M
innodb_log_file_size=24M
innodb_thread_concurrency=8

Hanut сказал:

Попробуйте в скрипте посмотреть в каком виде данные передаются в MySQL. Возможно они уже записываются в искаженном виде.

А как это сделать?

39

Re: Ошибка кодировки.

Hase сказал:

А как это сделать?

Где видите получаемую скриптом переменную, пробуйте ее отловить остановив выполнение скрипта.

exit($_POST['text']);

В конфигурационном файле MySQL все в порядке.

40 (изменено: Hase, 2012-01-28 20:16:31)

Re: Ошибка кодировки.

if(isset($_POST['text']))
{
$text = sanitizeString($_POST['text']);
$text = preg_replace('/\s\s+/', ' ', $text);
exit($_POST['text']);
$query = "SELECT * FROM profiles WHERE user='$user'";
if (mysql_num_rows(queryMysql($query)))
{
  queryMysql("UPDATE profiles SET text='$text' where user='$user'");
}

Сделал так. Браузер выдал информацию на русском языке. Значит ошибка именно в mysql. А можно изменить саму кодировку mysql?

41

Re: Ошибка кодировки.

Данные, которые идет в БД находятся в переменной $text, значит сперва надо проверить эту переменную.

exit($text);

Кодировку можно изменить и БД и таблицы и даже отдельно каждого поля. Все это делается с помощью phpMyAdmin.

42

Re: Ошибка кодировки.

Да, в этой переменной уже другая кодировка.

43

Re: Ошибка кодировки.

Hase сказал:

Да, в этой переменной уже другая кодировка.

Ищите что у вас происходит в функции sanitizeString().

44

Re: Ошибка кодировки.

function sanitizeString($var) // уничтожает потенциально вредоносный код и теги из информации введенной пользователем
{
$var = strip_tags($var);
$var = htmlentities($var);
$var = stripslashes($var);
return mysql_real_escape_string($var);
}

Вот эта функция. Я ее убрал и все заработало. Но что в ней не так? Все таки она мне нужна, можно ее исправить так, чтобы она не меняла кодировку?

45

Re: Ошибка кодировки.

Этого будет достаточно.

    function escape_string($str) {
        if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
            $str = stripslashes($str);
            $str = mysql_real_escape_string($str);
        } else {
            $str = mysql_real_escape_string($str);
        }
        return $str;
    }

46

Re: Ошибка кодировки.

Огромнейшее спасибо)

47 (изменено: mexicanose, 2012-02-09 05:23:44)

Re: Ошибка кодировки.

Здравствуйте. Помогите понять логику в кодировках..
двиг DLE, в кодировке utf-8 загрузил дамп БД, сейчас в phpmyadmin следующие настройки:
1. Сравнение при выборе БД в разделе Операции: utf8_general_ci.
2. Результат запроса "SHOW GLOBAL VARIABLES LIKE 'char%';":

character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

3. В структуре, 36 из 39 таблиц имеют Сравнение: cp1251_general_ci и если открыть таблицы то ее записи отображаются нормальным кириллическим шрифтом. Три оставшиеся таблицы в utf8_general_ci и они не содержат русского теста.

(Первый раз загрузив данный дамп я перекодировал все таблицы запросами ALTER TABLE table_name CONVERT CHARACTER SET utf8_general_ci DEFAULT CHARACTER SET cp1251_general_ci. Таблицы стали utf8 но на сайте так и выводились знаки вопросов).

При повторной загрузки дампа я не делал никаких изменений и настроек в phpmyadmin и все есть так как описано в 3-х пуктах, к сожалению дамп очень большой и я не могу его грузить больше чем раз в сутки для экспериментов :(
Да и логику хотелось бы уже наконец понять.

в конфиг файле DLE dbconfig.php: что при define ("COLLATE", "utf-8"); что при ("COLLATE", "cp-1251"); на сайте одни ????

48

Re: Ошибка кодировки.

mexicanose сказал:

Да и логику хотелось бы уже наконец понять.

1) Страницы сайта должны быть в кодировке utf-8.
2) Такая кодировка работать не будет:
define("COLLATE", "utf-8");
Должно быть:
define("COLLATE", "utf8");
3) Если в phpMyAdmin вы видите таблицы в кодировке cp1251, в которых корректно отображается кириллица - значит необходимо сменить кодировку таблиц на utf8. Проще всего это сделать прямо в дампе открыв его и заменив в структурах таблиц все cp1251 на utf8. Если дамп большой, то пробуйте делать это сохраняя в дамп отдельные таблицы. Для редактирования дампа используйте Notdpad++ или любой специализированный редактор кода.
4) Пользователь которым вы подключаетесь к MySQL не должен быть root и не должен иметь административных привилегий.

49

Re: Ошибка кодировки.

Hanut сказал:

2) Такая кодировка работать не будет:
define("COLLATE", "utf-8");
Должно быть:
define("COLLATE", "utf8");

Большое спасибо