[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с кодировкой базы
Nurmaga
С кодировкой мучаюсь уже давно, никак понять не могу как комментарий добавляются в базу UTF8 кодировке.

База в кодировке ср1251

mysql> SHOW CREATE DATABASE kav;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| kav | CREATE DATABASE `kav` /*!40100 DEFAULT CHARACTER SET cp1251 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.01 sec)

Табличка тоже:
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`parent_id` int(5) NOT NULL DEFAULT '0',
`post` int(10) NOT NULL,
`name` varchar(50) NOT NULL,
`comment` text NOT NULL,
`date_add` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=27 ;

Но когда добавляю комментарий, то в базу добавляются (Привет!) Подключение к базе:


$db = mysql_connect("localhost","root","") or die ("Не удалось подключиться к базе. Проверьте логин / пароль.");
$base = mysql_select_db("kav",$db) or die ("Не удалось подключиться к базе.");

mysql_query("SET NAMES 'cp1251';");
mysql_query("SET CHARACTER SET 'cp1251';");
mysql_query("SET SESSION collation_connection = 'cp1251_general_ci';");
mysql_query("SET lc_time_names = 'ru_RU'");


В файле .htaccess добавлена строка: adddefaultcharset windows-1251

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



Спустя 28 минут, 51 секунда (9.09.2011 - 01:16) Игорь_Vasinsky написал(а):
в подписи инструкции

Спустя 1 час, 59 минут, 42 секунды (9.09.2011 - 03:15) Nurmaga написал(а):
Цитата (Игорь_Vasinsky @ 8.09.2011 - 22:16)
в подписи инструкции

Что?

Спустя 8 минут, 47 секунд (9.09.2011 - 03:24) Игорь_Vasinsky написал(а):
Цитата
Что?

в моей подписи инструкции
Цитата
Проблемы с кодировкой?

Спустя 20 минут, 30 секунд (9.09.2011 - 03:45) Nurmaga написал(а):
Про кодировку почему то ничего не нахожу.(((

Спустя 6 часов, 18 минут, 17 секунд (9.09.2011 - 10:03) Winston написал(а):
Цитата (Nurmaga @ 9.09.2011 - 00:47)
В файле .htaccess добавлена строка: adddefaultcharset windows-1251

В heaccess нужно так писать
AddDefaultCharset windows-1251

Попробуй в верху файла прописать
header('Content-Type: text/html; charset=windows-1251');

Спустя 57 секунд (9.09.2011 - 10:04) Игорь_Vasinsky написал(а):
а ты вниз полистай....

Спустя 1 час, 35 минут, 13 секунд (9.09.2011 - 11:39) inpost написал(а):
Как рекомендация, переходи на ЮТФ, читай всё тут: http://phpforum.ru/index.php?showtopic=27289

Надо:
1) .htaccess кодировку
2) header() кодировку
3) <head><meta> - кодировку
4) SET NAMES кодировку
5) Кодировка ячеек в БД.
6) заново перенабрать текст!

Спустя 54 минуты, 8 секунд (9.09.2011 - 12:33) Nurmaga написал(а):
Что бы перейти на кодировку UTF8 нужно многое менять.

.htaccess файл именно так и есть: AddDefaultCharset windows-1251

В начале файла добавил:
header('Content-Type: text/html; charset=windows-1251');

Между тегами <head> прописан так:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Подключение к базе так:

$db = mysql_connect("localhost","root","") or die ("Не удалось подключиться к базе. Проверьте логин / пароль.");
$base = mysql_select_db("kav",$db) or die ("Не удалось подключиться к базе.");

mysql_query("SET NAMES 'cp1251';");
mysql_query("SET CHARACTER SET 'cp1251';");
mysql_query("SET SESSION collation_connection = 'cp1251_general_ci';");
mysql_query("SET lc_time_names = 'ru_RU'");


База в кодировке ср1251:

  
mysql> SHOW CREATE DATABASE kav;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| kav | CREATE DATABASE `kav` /*!40100 DEFAULT CHARACTER SET cp1251 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.01 sec)



Таблица comments:

ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=27 ;

В ней поля: comment и author тоже: cp1251_general_ci


Думаю это связано скриптом добавления...

Код добавления:



<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {



sleep(1);


if($_POST[parent_id]) $parent_id = preg_replace('/\D+/i','', $_POST[parent_id]);
else $parent_id = 0;

$author = trim($_POST[author]);
$comment = trim($_POST[comment]);



if(!$author) $error[author] = 'Введите имя!';
if(!$comment) $error[comment] = 'Напишите комментарий!';

if($error)
exit(json_encode($error));



require_once 'db.php';

$sql = "INSERT INTO comments (parent_id, name, comment, date_add) VALUES ($parent_id, '$author', '$comment', NOW())";
$result = mysql_query($sql);
if(!$result)
{
$error[] = 'Произошла ошибка, комментарий не сохранен';
exit(json_encode($error));
}
exit();
}

?>



А когда я добавляю комменты в ручную через phpMyAdmin, то на страничке они выводятся нормально.

Спустя 7 минут, 4 секунды (9.09.2011 - 12:40) Winston написал(а):
Цитата (Nurmaga @ 9.09.2011 - 12:33)
mysql_query("SET NAMES 'cp1251';");
mysql_query("SET CHARACTER SET 'cp1251';");
mysql_query("SET SESSION collation_connection = 'cp1251_general_ci';");
mysql_query("SET lc_time_names = 'ru_RU'");

Достаточно просто написать
mysql_query("SET NAMES cp1251");

Остальные три запроса не нужны.
Цитата (Nurmaga @ 9.09.2011 - 12:33)
$_POST[parent_id]

Все названия ключей массива возьми в одинарные кавычки
$_POST['parent_id'];
Цитата (Nurmaga @ 9.09.2011 - 12:33)
$sql = "INSERT INTO comments (parent_id, name, comment, date_add) VALUES ($parent_id, '$author', '$comment', NOW())";

И запрос перепиши
$sql = "INSERT INTO `comments`
(`parent_id`, `name`, `comment`, `date_add`)
VALUES ('"
. (int)$parent_id . "',
'"
. mysql_real_escape_string($author) . "',
'"
. mysql_real_escape_string($comment) . "',
NOW())"
;

Спустя 8 минут, 19 секунд (9.09.2011 - 12:49) inpost написал(а):
Nurmaga
Зайди в свойства документа, убедишь, что все файлы у тебя в нужной кодировке. В DreamWeaverе это можно глянуть нажав правой кнопкой и зайти в свойства, или при сохранении.

Спустя 3 минуты, 35 секунд (9.09.2011 - 12:52) Игорь_Vasinsky написал(а):
если ты подключаешь другие файлы к странице - они тоже должны соответствовать кодировке.

Спустя 8 минут, 32 секунды (9.09.2011 - 13:01) Nurmaga написал(а):
Цитата (Winston @ 9.09.2011 - 09:40)
Цитата (Nurmaga @ 9.09.2011 - 12:33)
mysql_query("SET NAMES 'cp1251';");
mysql_query("SET CHARACTER SET 'cp1251';");
mysql_query("SET SESSION collation_connection = 'cp1251_general_ci';");
mysql_query("SET lc_time_names = 'ru_RU'");

Достаточно просто написать
mysql_query("SET NAMES cp1251");

Остальные три запроса не нужны.
Цитата (Nurmaga @ 9.09.2011 - 12:33)
$_POST[parent_id]

Все названия ключей массива возьми в одинарные кавычки
$_POST['parent_id'];
Цитата (Nurmaga @ 9.09.2011 - 12:33)
$sql = "INSERT INTO comments (parent_id, name, comment, date_add) VALUES ($parent_id, '$author', '$comment', NOW())";

И запрос перепиши
$sql = "INSERT INTO `comments`
(`parent_id`, `name`, `comment`, `date_add`)
VALUES ('"
. (int)$parent_id . "',
'"
. mysql_real_escape_string($author) . "',
'"
. mysql_real_escape_string($comment) . "',
NOW())"
;

Сделал все как вы сказали, но ничего не изменилось.

Там есть еще 2 файла. Может в них проблема.

comment.js:

$(function (){

/* Объект sendDataComment будет содержать данные для отправки на сервер
commentForm - переменная, в которую будет помещен клон формы */


var sendDataComment = {};
var commentForm;

// Функция создает форму для ответа путем клонирования нашей спрятанной формы
function CommentForm()
{
if(commentForm)
{
// Проверяем существования клона. Если он уже создан, то удаляем его, а затем создаем новый.
removeCommentForm();
}
commentForm = $('#newComment').clone();
}

// Функция удаления клона
function removeCommentForm()
{
commentForm.remove();
sendDataComment = {};
}


/* На событие клика по кнопке "Добавить комментарий/Ответить" вешаем необходимые действия */

$('#addNewComment, .reply').click(function(){

CommentForm(); // Создаем клона формы

if($(this).attr('id') == 'addNewComment')
{
// Новый комментарий
// Добавляем форму после всех комментариев

commentForm.appendTo('#commentRoot');

}
else
{
// Новый ответ
// Добавляем форму под родительским комментарием
// Для этого находим родительский элемент li

var parentComment = $(this).parent().parent();

// в sendDataComment добавим идентификатор родителя
sendDataComment.parent_id = parentComment.attr('id');


var childs = parentComment.find('ul'); // Ищем у этого коммента потомков (ответы)

if(!childs.length)
{
// Если у этого комментария нет ответов (потомков) добавим для ответов контейнер ul, а затем уже в этот контейнер нашу форму
parentComment.append('<ul></ul>');
commentForm.appendTo(parentComment.children('ul'));
}
else
commentForm.prependTo(childs); // Добавляем форму в контейнер для ответов

}

commentForm.show(); // Показываем форму

return false; // предотвращаем дефолтное действие браузера
});



$('#cancelComment').live('click', function(){
// Здесь live обязательно, т.к. мы работаем не с самой формой, а ее клоном
removeCommentForm();

})


/* По клику на кнопку "Сохранить", доформировываем объект данных и отправляем их на сервер */

$('#newComment button').live('click',function(){
sendDataComment.author = commentForm.find("input[name='name']").val();
// Подробнее о поиске элементов по аттрибутам тут http://ruseller.com/lessons.php?rub=32&id=682
sendDataComment.comment = commentForm.find("textarea").val();

sendData(); // Отправка данных

});

// Функция отправки данных комментария на сервер

// Отправка комментария на сервер

function sendData()
{
commentForm.find('button').hide().next().show(); // Прячем кнопку и показываем лоадер
$.post(
"savecomment.php",
sendDataComment,
function(data){ // Обработчик ответа от сервера


if(data)
{
// Если что-то пришло, значит есть ошибки
data = $.parseJSON(data); // Преобразовываем пришедшую строку JSON в объект JS

// Теперь в цикле пройдемся по всем ошибкам


var errors ='';
$.each(data, function(i, val) {
errors += val+'\n';

// alert(i);
/* В i на каждой итерации цикла содержится имя поля,
в котором возникла ошибка, расскоментируйте alert() выше
и отправьте комментарий, заведомо содержащий ошибку.
Подумайте, как это можно использовать. */


});
commentForm.find('button').show().next().hide(); // показываем кнопку и прячем лоадер
alert(errors);

/* Выведем ошибки простым alert-ом.
Но по-хорошему, конечно же, такие сообщения лучше встроить
на страницу, под тем полем, где возникла ошибка. */


}
else // Если ошибок нет, значит у нас все нормально сохранилось
formToComment(); // Форму комментария преобразуем в просто коммент
}
)
}

// Функция преобразование формы в комментарий

function formToComment()
{
commentForm.find('h6').text(sendDataComment.author); // Заменяем содержимое h6 на имя комментатора (инпут таким образом сам удалится)
commentForm.find('.comment').text(sendDataComment.comment); // Заменяем содержимое блока div с классом .comment только на текст (текстарея удалится сама)

// Удаляем теперь уже лишние элементы

commentForm.find('button').remove(); // Удаляем кнопку
commentForm.find('.loader').remove(); // Удаляем картинку-лоадер
commentForm.find('#cancelComment').remove(); // Удаляем кнопку закрытия формы
/* Обязательно Удаляем атрибут id у клона.
На данный момент он у объекта commentForm такой же, что и у спрятанной базовой формы,
а это значит: во-первых, двух элементов с одинаковым id быть не должно,
во-вторых, оставлять id никак нельзя, иначе в дальнейшем, при попытке создания нового клона, клонироваться будет этот комментарий, а не нужная нам форма
*/

commentForm.removeAttr('id');
commentForm = null;
// Обязательно commentForm присваиваем значение null, таким образом, мы разорвем связь между полученным в итоге комментом и объектом в js
}




}
);


comments.php



<?php

require_once 'db.php';

$sql = "
SELECT id, parent_id, name, comment,
DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
FROM comments
"
;

$query = mysql_query($sql);

while($row = mysql_fetch_assoc($query))
{
$data[$row[id]] = $row;
}

function mapTree($dataset) {
$tree = array(); // Создаем новый массив
/*
Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
в $id будет попадать уникальный id комментария,
&$node - обратите внимание, работаем со значением по ссылке!
*/

foreach ($dataset as $id=>&$node) {
if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
$tree[$id] = &$node;
} else {
/*
Иначе это чей-то потомок
этого потомка переносим в родительский элемент,
при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки
*/

$dataset[$node['parent_id']]['childs'][$id] = &$node; //

}
}


return $tree;
}





function commentsToTemplate($comment)
{
/* $comment - массив комментария - имя, дата, коммент, потомки (если есть) */

/* Включаем буферизацию вывода, чтобы шаблон не вывелся в месте вызова функции.
*/

ob_start();

// Подключаем шаблон comment_template.php, который просто таки ждет наш массив $comment ))
include 'comment_template.php';

$comments_string = ob_get_contents(); // Получаем содержимое буфера в виде строки
ob_end_clean(); // очищаем буфер

return $comments_string;
// Можно применить более короткую запись - return ob_get_clean(); вместо $comments_string = ob_get_contents(); ob_end_clean(); return $comments_string;
}



function commentsString($data)
{
foreach($data as $w) {
$string .= commentsToTemplate($w);
}

return $string;
}

$data = mapTree($data);
$comments = commentsString($data);
$data = null;








?>
</body>
</
html>



Спустя 5 минут, 22 секунды (9.09.2011 - 13:06) inpost написал(а):
Nurmaga
скинь мне эти файлы сюда: inpost@list.ru , я хочу убедиться, что ты правильно проставил кодировки.

Спустя 5 минут, 32 секунды (9.09.2011 - 13:12) Nurmaga написал(а):
Отправил.

Спустя 26 минут, 8 секунд (9.09.2011 - 13:38) inpost написал(а):
Банально у тебя стоит Западноевропейская кодировка, вместо кирилицы Виндовс: http://my.jetscreenshot.com/demo/20110909-o6kd-45kb
Так же ты мне не скинул файлы, где у тебя кодировка в <meta>, конфиг подключения, где ты прописал header()

Спустя 4 минуты, 7 секунд (9.09.2011 - 13:42) Nurmaga написал(а):
Цитата
Банально у тебя стоит Западноевропейская кодировка

В какой это файле?

Цитата
Так же ты мне не скинул файлы, где у тебя кодировка в <meta>

Сам по себе этот файл не откроется.
Шас скину оба.

Спустя 11 минут, 2 секунды (9.09.2011 - 13:53) inpost написал(а):
Nurmaga
Во всех файлах.

Спустя 16 минут, 11 секунд (9.09.2011 - 14:09) Nurmaga написал(а):
Как исправить?

Спустя 10 минут, 1 секунда (9.09.2011 - 14:19) inpost написал(а):
Открываем index.php, там нет этой строчки:
header('Content-Type: text/html; charset=windows-1251'); - внутри db.php - тоже нет.
Отсутствует .htaccess , в котором должен был прописать кодировку!
Чистой воды Попов, иди в подпись переучиваться.

Исправить - либо при сохранении, либо в свойстве документа поменять кодировку.
Вот эта строчка вообще должна выглядеть вместо:
$sql = "INSERT INTO comments (parent_id, name, comment, date_add) VALUES ($parent_id, '$author', '$comment', NOW())";


Вот так:
$sql = mysql_query("
INSERT INTO `comments` SET
`parent_id` = "
.(int)$_POST['parent_id'].",
`name` = '"
.mysql_real_escape_string($_POST['author'])."',
`comment` = '"
.mysql_real_escape_string($_POST['comment'])."'
"
) or die(mysql_error());


Да и вообще, со следующего сайта использую ЮТФ, только он нормально всегда и везде работает.

Спустя 1 час, 53 минуты, 35 секунд (9.09.2011 - 16:13) Nurmaga написал(а):
Спасибо всем! оставлю это дело. не вышло у меня ничего.

Спустя 4 минуты, 24 секунды (9.09.2011 - 16:17) Winston написал(а):
Цитата (Nurmaga @ 9.09.2011 - 16:13)
оставлю это дело. не вышло у меня ничего

Молодец, правильно решил, бросай к чертям это программирование smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.