Форум » Вебмастер и вебдизайн » Языки программирования » Ajax и кодировка текста после DB-запроса
Открыть Ответить

Ajax и кодировка текста после DB-запроса

21.07.2010 14:52:48 21.07.2010 15:06:15

Привет всем, такая вот у меня проблемка...

Делаю редактирование текста на аяксе, по примеру как на форуме этого сайта (редактирование своего сообщения), только у меня - редактирование описания товара в интернет-магазине. Суть проста: DIV, в него заключено само описание, при нажатии "Редактировать", вызывается ajax-функция (перенаправление на php-функцию, в которой описание заново берется из бд), затем это описание появляется в теге textarea, и тд.. так вот - после того, как скрипт запросит из БД описание - все русские символы предстают как знаки вопроса. Кодировка сайта и базы - win1251. В чем дело?

картиночка - http://s002.radikal.ru/i200/1007/ac/bb3bcff70e13.jpg


Пробую:


$text = iconv("utf-8", "windows-1251", $text);


не помогает. Поле textarea появляется пустым.

SLAED CMS 2.6 Lite
PHP 4
Сервер в интернете
Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

Кажется, проблема решена.

Помогла строка:


$text = mb_convert_encoding($text, "utf-8", "windows-1251");

Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

21.07.2010 17:42:21 21.07.2010 17:44:13

Новая проблема... самая важная... Копаюсь тут полдня уже, а ничего не выходит. Не сохраняет она в базу данных!

Помогите чем можете, где ошибка?

Вот куски кода:

JS:

<br /> <br /> var ajax = new sack();<br /> <br /> function WhenLoading(obj) {<br /> var e = document.getElementById("rep"+obj); <br /> e.innerHTML = "<center><img src=\"images/misc/loading.gif\"></center>";<br /> }<br /> <br /> function LoadPost(ld, obj) {<br /> var form = document.getElementById("form"+obj);<br /> ajax.setVar("go", form.go.value);<br /> ajax.setVar("op", form.op.value);<br /> ajax.setVar("id", form.id.value);<br /> ajax.setVar("text", form.text.value);<br /> ajax.requestFile = "ajax.php";<br /> ajax.method = form.method.value;<br /> ajax.element = "rep"+obj;<br /> if (ld == '1') {<br /> ajax.onLoading = WhenLoading(obj);<br /> } else {<br /> ajax.onLoading = "";<br /> }<br /> ajax.runAJAX();<br /> }<br /> <br /> function LoadGet(ld, obj, go, op, id, typ, mod, text) {<br /> ajax.setVar("go", go);<br /> ajax.setVar("op", op);<br /> ajax.setVar("id", id);<br /> ajax.setVar("typ", typ);<br /> ajax.setVar("mod", mod);<br /> ajax.setVar("text", text);<br /> ajax.requestFile = "ajax.php";<br /> ajax.method = "GET";<br /> ajax.element = "rep"+obj;<br /> if (ld == '1') {<br /> ajax.onLoading = WhenLoading(obj);<br /> } else {<br /> ajax.onLoading = "";<br /> }<br /> ajax.runAJAX();<br /> }<br /> <br />


PHP:

function editpost() {
	global $db;

	$lid = (isset($_POST['id'])) ? ((isset($_POST['id'])) ? intval($_POST['id']) : "") : ((isset($_GET['id'])) ? intval($_GET['id']) : "");
	$obj = "for".$lid."";
	$go = 3;
	$op = "editpost";

	$result = $db->sql_query("SELECT lid, shortdescription from asershop_products where lid=$lid");
	list($lid, $text) = $db->sql_fetchrow($result);

	$text = mb_convert_encoding($text, "utf-8", "windows-1251");

	$code = "<form id=\"form".$obj."\" method=\"post\" action=\"ajax.php\">"
	."<input type=\"hidden\" name=\"method\" value=\"POST\">"
	."<input type=\"hidden\" id=\"go\" name=\"go\" value=\"".$go."\">"
	."<input type=\"hidden\" id=\"op\" name=\"op\" value=\"editpost\">"
	."<input type=\"hidden\" id=\"id\" name=\"id\" value=\"".$lid."\">"
	."<textarea id=\"text\" name=\"text\" cols=\"65\" rows=\"20\">".$text."</textarea>"
	."<div style=\"clear: both;\"><input type=\"submit\" value=\"".mb_convert_encoding(Применить, "utf-8", "windows-1251")."\" OnClick=\"LoadPost('1', '".$obj."'); return false;\" OnDblClick=\"LoadPost('1', '".$obj."'); return false;\" title=\"".mb_convert_encoding(Применить, "utf-8", "windows-1251")."\" class=\"ebutton\"></form>"
	
	."<input type=\"submit\" value=\"".mb_convert_encoding(Отмена, "utf-8", "windows-1251")."\" OnClick=\"LoadGet('1', '".$obj."', '".$go."', 'showpost', '".$lid."', '".$typ."', '".$mod."', ''); return false;\" OnDblClick=\"LoadGet('1', '".$obj."', '".$go."', 'showpost', '".$lid."', '".$typ."', '".$mod."', ''); return false;\" title=\"".mb_convert_encoding(Отмена, "utf-8", "windows-1251")."\" class=\"bbutton\"></div>";
echo $code;


	$db->sql_query("UPDATE asershop_products SET shortdescription='$text' WHERE lid='$lid'");
}

SLAED CMS 2.6 Lite
PHP 4
Сервер в интернете
Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

21.07.2010 17:59:05 21.07.2010 18:00:25

Вот то что в конце - $db->sql_query("UPDATE.... - если эту строку не убрать, то даже если просто кликнуть по кнопке "редактировать", и обновить страницу, вместо читаемого текста появятся крякозябры (То есть в базе всё таки значение поля shortdescription будет перезаписано). Причем в поле можно писать любые символы, латиницу, цифры, без разницы, всё равно будут крякозыбры, которые запишутся в базу, и с каждым сохранением их будет становится больше, независимо от того, что я ввел например английские слова, то есть скрипт как то своей жизнью будет жить чтоли)

Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

21.07.2010 18:48:00 21.07.2010 18:56:31

Goshan, аякс всегда работает на utf-8, следовательно текст после вывода через аякс и до записи в БД нужно конвертировать в win-1251.
Чтобы говорить конкретно где и когда конвертировать кодировки, нужно работать с Вашим скриптом, но в любом случае дело только в них...
Идеальный вариант, это когда текст конвертируется перед выводом через Аякс в utf-8, после обработки происходит обратная конвертация в win-1251 и так далее.
Попробуйте перед textarea сделать принудительную конвертацию:

Header("Content-Type: text/html; charset=windows-1251");

GRAFLEKX
  • Группа: Супермодераторы
  • Пункты: 1595
  • Регистрация: 18.09.2008
  • Пол: Мужчина
  • Из: Россия
GRAFLEKX
3.92

3.92

21.07.2010 18:59:14 21.07.2010 19:14:46

Думаете, в бд не записывается из-за кодировки? А ошибки в моем коде есть? Я вроде всё приложил, что использую. Т.к. я не шарю в аяксе впринципе, ошибки там по-любому есть.

Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

21.07.2010 19:05:33 21.07.2010 19:09:44

В БД не записывается? Нет, кодировка при записи в БД не при чем, в БД без разницы что записывать, если это текстовое поле.
Нужно копаться в скрипте, пробовать, посмотрю попозже, пока нет времени...
ps: Вы посмотрите напрямую в таблицу, записывается что-то или нет вообще...

GRAFLEKX
  • Группа: Супермодераторы
  • Пункты: 1595
  • Регистрация: 18.09.2008
  • Пол: Мужчина
  • Из: Россия
GRAFLEKX
3.92

3.92

напрямую по моему тоже не сохраняет, если имеется ввиду сделать через ajax.php?lid=303&op=editpost бла бла...

Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

GRAFLEKX, не появилось ли у вас каких-либо мыслей? Смайл - 17

Вопрос еще весьма актуален, никак не удается вникнуть до конца в суть аякс-машины )))))

Goshan
  • Группа: Посетители
  • Пункты: 729
  • Регистрация: 07.10.2006
  • Пол: Мужчина
  • Из: Россия/Москва
Goshan
3.91

3.91

24.07.2010 13:26:18 25.07.2010 20:35:39

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

Можете скинуть мне на graf76[собака]yandex.ru?

GRAFLEKX
  • Группа: Супермодераторы
  • Пункты: 1595
  • Регистрация: 18.09.2008
  • Пол: Мужчина
  • Из: Россия
GRAFLEKX
3.92

3.92

Всего: 16 на 2 страницах по 10 на каждой странице

1 2
Открыть Ответить

Хотите опробовать SLAED CMS в действии?

Идеи и предложения
Обратная связь