Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: проблема с кодировкой php, mysql  (Прочитано 1586 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн EcSpl01t

  • Автор темы
  • Новичок
  • *
  • Сообщений: 25
    • Просмотр профиля
проблема с кодировкой php, mysql
« : 02 Мая 2012, 12:21:23 »
Здравствуйте. Я не знаю, выбрал ли я правильный раздел для задавания вопроса или нет....
я не знал куда еще можно было написать такой вопрос...
Ну вот и сам вопрос:

Проблема заключается в кодировке комментариев. Сайт сам по себе на кодировке cp1251, форма комментариев на utf8. Что-то я не знаю как правильно выразится, расскажу сам процесс...
То есть когда я добавляю заявку/комментарий он сразу показывает его в cp1251 без обновление страницы (скрин1- слева), после обновление страницы я вижу уже кодировку в utf8(скрин1-справа), если зайди в phpmyadmin после добавление комментария то мы увидим (скрин 2) иероглифы, не зависимо от кодировки.
Я так понял, что отправка комментария сама по себе кривая, отсылает из php в mysql в utf8.
Сам вопрос, как сделать так, чтобы отсылал в cp1251?

http://upyourpic.org/images/201204/px3e1tdt1a.png -скрин1
http://upyourpic.org/images/201204/kjzdmhfrgr.png -скрин2

comment.class.php
<?php  
class Comment
{
private $data = array();

public function __construct($row)
{
/*
/ Конструктор
*/

$this->data $row;
}

public function markup()
{
/*
/ Данный метод выводит разметку XHTML для комментария
*/

// Устанавливаем псевдоним, чтобы не писать каждый раз $this->data:
$d = &$this->data;

$link_open '';
$link_close '';

if($d['url']){

// Если был введн URL при добавлении комментария,
// определяем открывающий и закрывающий теги ссылки

//$link_open = '<a href="'.$d['url'].'">';
//$link_close =  '</a>';
}
$sostav '<b>СоставЫЫЫasdddd:</b>';
// Преобразуем время в формат UNIX:
$d['dt'] = strtotime($d['dt']);

// Нужно для установки изображения по умолчанию:
$url 'http://'.dirname($_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]).'/img/default_avatar.gif';

return '

<div class="comment">
<div class="avatar">
'
.$link_open.'
<img src="http://cup.acantari.org.ua/images/default_avatar.gif" />
'
.$link_close.'
</div>

<div class="name"><b>Название команды:</b> '
.$link_open.$d['name'].$link_close.'</div>
<div class="sostav">'
.$sostav.$link_open.$d['sostav'].$link_close.'</div><br>
<div class="contact"><b>Контакты:</b>'
.$link_open.$d['contact'].$link_close.'</div>
<div class="date" title="Added at '
.date('H:i \o\n d M Y',$d['dt']).'">'.date('d M Y',$d['dt']).'</div>
<p>'
.$d['conntact'].'</p>
</div>
'
;
}

public static function validate(&$arr)
{
/*
/ Данный метод используется для проверки данных отправляемых через AJAX.
/
/ Он возвращает true/false в зависимости от правильности данных, и наполняет
/ массив $arr, который преается как параметр либо данными либо сообщением об ошибке.
*/

$errors = array();
$data = array();

// Используем функцию filter_input, введенную в PHP 5.2.0

if(!($data['sostav'] = filter_input(INPUT_POST,'sostav',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['sostav'] = 'Пожалуйста, введите полный Состав.';
}
if(!($data['pravila'] = filter_input(INPUT_POST,'pravila',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['pravila'] = 'Пожалуйста, выберете да/нет.';
}


// Используем фильтр с возвратной функцией:

if(!($data['contact'] = filter_input(INPUT_POST,'contact',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['contact'] = 'Пожалуйста, введите контакты.';
}

if(!($data['name'] = filter_input(INPUT_POST,'name',FILTER_CALLBACK,array('options'=>'Comment::validate_text'))))
{
$errors['name'] = 'Пожалуйста, введите название команды.';
}

if(!empty($errors)){

// Если есть ошибки, копируем массив $errors в $arr:

$arr $errors;
return false;
}

// Если данные введены правильно, подчищаем данные и копируем их в $arr:

foreach($data as $k=>$v){
$arr[$k] = mysql_real_escape_string($v);
}

// email дожен быть в нижнем регистре:

$arr['sostav'] = strtolower(trim($arr['sostav']));

return true;

}

private static function validate_text($str)
{
/*
/ Данный метод используется как FILTER_CALLBACK
*/

if(mb_strlen($str)<1)
return false;

// Кодируем все специальные символы html (<, >, ", & .. etc) и преобразуем
// символ новой строки в тег <br>:



// Удаляем все оставщиеся символы новой строки
$str str_replace(array(chr(10),chr(13)),'',$str);

return $str;
}

}

?>


submit.php
<?php

// Сообщение об ошибке:
error_reporting(E_ALL^E_NOTICE);

include 
"connect.php";
include 
"comment.class.php";

/*
/ Данный массив будет наполняться либо данными,
/ которые передаются в скрипт,
/ либо сообщениями об ошибке.
/*/

$arr = array();
$validates Comment::validate($arr);

if(
$validates)
{
/* Все в порядке, вставляем данные в базу: */

mysql_query("INSERT INTO comments(name,sostav,pravila,contact)
VALUES (
'"
.$arr['name']."',
'"
.$arr['sostav']."',
'"
.$arr['pravila']."',
'"
.$arr['contact']."'
)"
);

$arr['dt'] = date('r',time());
$arr['id'] = mysql_insert_id();

/*
/ Данные в $arr подготовлены для запроса mysql,
/ но нам нужно делать вывод на экран, поэтому 
/ готовим все элементы в массиве:
/*/

$arr array_map('stripslashes',$arr);

$insertedComment = new Comment($arr);

/* Вывод разметки только-что вставленного комментария: */

echo json_encode(array('status'=>1,'html'=>$insertedComment->markup()));

}
else
{
/* Вывод сообщений об ошибке */
echo '{"status":0,"errors":'.json_encode($arr).'}';
}

?>

connect.php
<?php

/* Конфигурация базы данных */

$db_host 'localhost';
$db_user 'root';
$db_pass '************';
$db_database 'fastcup'

/* Конец секции */


$link = @mysql_connect($db_host,$db_user,$db_pass) or die('Не могу установить соединение с базой данных');

mysql_query ("set character_set_client='cp1251'"); 
mysql_query ("set character_set_results='cp1251'"); 
mysql_query ("set collation_connection='cp1251_general_ci'");  
mysql_select_db($db_database,$link);

?>

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13761
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #1 : 02 Мая 2012, 12:44:08 »
Не, не тот раздел. Вам в Разработка/Программирование. Просите, чтобы тему перенесли. Или эту убивайте и там создавайте.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #2 : 02 Мая 2012, 13:17:24 »
1. include_once ! Если не вообще require_once.
2. set character_set_client = utf8, раз уж отправляете данные серверу в utf8.
Либо озаботьтесь перекодировкой перед отправкой.
3. Перемешивать PHP и HTML в одном файле так, как это делаете вы - моветон. Сами в этой каше не разберётесь, про других и говорить нечего. Шаблонизаторы существуют уже хрен знает сколько.

Пользователь решил продолжить мысль 02 Мая 2012, 13:24:19:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html
http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html
« Последнее редактирование: 02 Мая 2012, 13:24:19 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #3 : 02 Мая 2012, 14:36:02 »
При отправке данных с формы на сервер используется AJAX?

Оффлайн EcSpl01t

  • Автор темы
  • Новичок
  • *
  • Сообщений: 25
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #4 : 02 Мая 2012, 17:11:26 »
Всем спасибо за ответы,
да юзаю  AJAX и я так понял что там utf8
мне посоветували забыть про cp1251 и юзать utf8...

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #5 : 02 Мая 2012, 20:05:22 »
Всем спасибо за ответы,
да юзаю  AJAX и я так понял что там utf8
мне посоветували забыть про cp1251 и юзать utf8...

Посоветуйте вашим советчикам посоветовать самим себе всякого-разного.
Мне тоже один раз такие "советчики" "посоветовали" - "ну просто пропишите в странице кодировку utf-8".
После того, как я им отправил mht'шку с примером воплощения их совета, они заткнулись и больше ничего советовать не рисковали.

Вам надо не "забивать и использовать", а точно определиться, где у вас какая кодировка наличествует, почему она там такая (какие настройки на неё влияют), и либо изменить настройки того, что работает в другой кодировке, так, чтобы везде было одинаково, либо подправить там, где можно, чтобы результат был такой, какой вам нужен.
« Последнее редактирование: 02 Мая 2012, 20:07:07 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн EcSpl01t

  • Автор темы
  • Новичок
  • *
  • Сообщений: 25
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #6 : 03 Мая 2012, 10:09:32 »
та мне уже надоело пытаться сделать кодировку, пару дней сидел, надоело уже... возможно была причина в AJAX

перевел все в utf-8 все нормально работает!

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28511
    • Просмотр профиля
Re: проблема с кодировкой php, mysql
« Ответ #7 : 03 Мая 2012, 16:26:04 »
Не надо "пытаться сделать", перечитайте моё предыдущее собщение.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.026 секунд. Запросов: 22.