Jump to content
  • 0

AJAX общие вопросы


AlexHog
 Share

Question

Добрый день.

Начинаю изучать ajax, пытаюсь выполнить учебный пример.

В примере нужно создать три файла - html, js и php.

Суть примера - пользователь вводит в поле ввода имя, яваскрипт отсылает введенный текст серверному скрипту, скрипт проверяет совпадение имени с одним из эл-тов массива. При совпадении отдает через xml один ответ, при несовпадении другой. Страница принимает ответ, обрабатывает xml и отображает текст в div-е.

Текст скриптов ниже, пока суть проблемы: похоже, что либо не срабатывает функция, вызываемая через timeout -

setTimeout('process()', 1000);

- либо что-то не так с xml. Вставляю в процедуру обработки ответа сервера алерт, алерт молчит. Проверяю работу пхп-скрипта - получаю немножко не тот ответ, который дан в книге: вместо

<response>Здравствуйте, аlex!</response>

- получаю вот такое:

dd42a4992c0f.gif

В чем может быть дело, как это решать?

Link to comment
Share on other sites

25 answers to this question

Recommended Posts

  • 0

текст скриптов.

хтмл:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>AJAX & PHP</title>
<script type='text/javascript' src='quickstart.js'></script>
</head>
<body onload='process()'>
Сервер желает узнать ваше имя:
<input type='text' id='myName' />
<div id='divMessage' />
</body>
</html>

js:

var xmlHttp = createXmlHttpRequestObject();

function createXmlHttpRequestObject()
{
// alert (document.getElementById('myName').value);
var xmlHttp;
if(window.ActiveXObject)
{
try
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
xmlHttp = false;
}
}
else
{
try
{
xmlHttp = new XMLHttpRequest();
}
catch(e)
{
xmlHttp = false;
}
}

if(!xmlHttp)
alert("Ошибка создания объекта");
else
{
// alert(xmlHttp.readyState);
return xmlHttp;
}
}



function process()
{
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
name = encodeURIComponent(document.getElementById('myName').value);
xmlHttp.open('GET', 'quickstart.php?name=' + name, true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
}
else
setTimeout('process()', 1000);
}


function handleServerResponse()
{
if (xmlHttp.readyState == 4)
{
if (xmlHttp.status == 200)
{
xmlResponse = xmlHttp.responseXML;
xmlDocumentElement = xmlResponse.documentElement;
helloMessage = xmlDocumentElement.firstChild.data;
document.getElementById('divMessage').innerHTML = '<i>' + helloMessage + '<i>';
setTimeout('process()', 1000);
}
else
{
alert('При обращении к серверу возникли проблемы: ' + xmlHttp.statusText);
}
}
}

php:

<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';

echo '<response>';
$name = $_GET['name'];
$userNames = array('ALEX', 'MARSYLIJ');
if (in_array(strtoupper($name), $userNames))
echo 'Здравствуйте, ' . htmlentities($name) . '!';
else if (trim($name) == '')
echo 'Скажи мне, как зовут тебя, незнакомец!';
else
echo htmlentities($name) . ' , вы мне не знакомы!';
echo '</response>';
?>

Link to comment
Share on other sites

  • 0

спасибо.

Если сохранять через WordPad - это "документ Unicode"?

сохранил пхп как Unicode, исправил ошибку в js-скрипте в функции handleServerResponse. Теперь выдает ошибку в строке 69 - на этой строчке: helloMessage = xmlDocumentElement.firstChild.data;

Проверяю работу пхп-скрипта - на домашней машине не выдает вообще ничего, пустую страницу; на хостинге Агавы - страничку полную квадратиков с редкими вкраплениями вариантов ответов скрипта :) Пытаюсь переключить кодировку в браузере на UTF-8 - бестолку.

Link to comment
Share on other sites

  • 0

Поменял в файле пхп в строчке -

echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';

- на windows-1251. При проверке пхп получаю то, что нужно:

 <?xml version="1.0" encoding="windows-1251" standalone="yes" ?> 
<response>Здравствуйте, alex!</response>

При проверке хтмл - все работает совершенно правильно. Разумеется до тех пор, пока не ввожу русский шрифт :) И пока оба документа сохранены в виндовс-кодировке.

При сохранении документов как Unicode - пхп выдает пустой экран, js глохнет на обработке xml, получаемого от пхп-скрипта. Независимо от того, какая кодировка задана xml-у в скрипте.

Link to comment
Share on other sites

  • 0

Во первых (если я не ошибаюсь) XML согласно спецификации всегда должен быть в UTF кодировке.

При тестировании я обнаружил следующую ошибку

Warning: Cannot modify header information - headers already sent by

Происходит это (как выяснилось при детальном изучении файла) через то, что редакторы добавляют в начало файла лишние байты для идентификации ЮТФ-кодировки. А заголовок может быть послан только когда вывод еще не производился.

Поэтому:

1. сохраняй все файлы в ЮТФ

2. удали как-нибудь эти два байта в начале (хекс-редактором) или закомментируй строчку

header('Content-Type: text/xml');

а также замени htmlentities($name) не просто $name в quickstart.php

все должно работать.

Link to comment
Share on other sites

  • 0
Нет?

Посмотрел спецификацию

http://www.w3.org/TR/REC-xml/#charencoding

Although an XML processor is required to read only entities in the UTF-8 and UTF-16 encodings, it is recognized that other encodings are used around the world, and it may be desired for XML processors to read entities that use them. In the absence of external character encoding information (such as MIME headers), parsed entities which are stored in an encoding other than UTF-8 or UTF-16 MUST begin with a text declaration (see 4.3.1 The Text Declaration) containing an encoding declaration:

Ну как сказать, немножко ошибся, но не совсем... рекомендуется использовать только UTF-8 и UTF-16.

Link to comment
Share on other sites

  • 0

В последней цитате, на сколько я правильно ее понимаю, речь идет не о кодировке, а о сущностях. О том, что по умолчанию они читаются в кодировке UTF, а если указать кодировку ? в указанной кодировке.

Никаких ограничений на кодировку в XML нет, кроме того, что эта кодировка должна существовать и ?быть известной? (см. http://www.iana.org/assignments/character-sets).

//добавлено

между делом, я согласен, что в XML лучше использовать UTF :)

Link to comment
Share on other sites

  • 0

2 AlexHog, твой скрипт и с кодировкой utf-8 для xml работает. Что сделано:

1. сохранил в юникоде код quickstart.php (в Дриме, код второго поста) без ВОМ, без нормализации

2. так как идет URL кодирование, в РНР скрипте надо сделать обратку $name = rawurldecode($_GET['name']); для русских букв и прочих символов. htmlentities() ессно дело не использовал, ибо HTML сущности здесь не нужны. хотя на всяк случай нужно использовать, что б умельцы не забивали к.-л. код

и все... больше никаких кодировок других файлов не менял

проверено под WinXP SP2, FF2, IE 6.0 на Apache 1.3.33 + PHP4.4.0

проверено под Linux Apache 1.3.37 + PHP4.4.4

2 vartem, это все верно. имхо, у РНР есть малюсенький зихерок: при генерации xml и при парсенге xml на сервере РНР не понимает другой кодировки кроме utf-8 для этих файлов. покрайней мере так было для РНР 4 и РНР5.0

Link to comment
Share on other sites

  • 0

Yarik Voronov, да, у php были и есть проблемы с кодировками и с юникодом, в частности. Сейчас вроде ведутся работы в шестой версии: обрабатывают все функции на корректность работы с юникодом. Что получится ? увидим :) Но, честно говоря, эти проблемы зачастую проходили мимо меня, так что беру информацию со слухов :)

при генерации xml и при парсенге xml на сервере РНР не понимает другой кодировки кроме utf-8

Что подразумеваете под генерацией? И что используете для генерации, парсинга?

У меня обычно при работе в php над xml идет полностью английский, а значит ? проблемы с кодировками врятли могут возникнуть. Пару раз при работе с русским и использовании SimpleXML была проблема с генерацией выходного XML. Как Вы сказали, выдавался результат в юникоде ? не смотря на то, что перед этим парсился документ с указанной кодировкой ? windows-1251 (причем, парсился он в корректной кодировке; хотя, может быть, мне показалось). Не помню как обходил проблему, первое, что сейчас приходит в голову, ? функции iconv?

Link to comment
Share on other sites

  • 0
Что подразумеваете под генерацией? И что используете для генерации, парсинга?

Под генерацией, я подразумевал создание XML документа библиотеками РНР, когда для разбора и анализа требуется создать DOM структуру XML документа, а не просто выдать его методом echo, print

У меня обычно при работе в php над xml идет полностью английский, а значит ? проблемы с кодировками врятли могут возникнуть. Пару раз при работе с русским и использовании SimpleXML была проблема с генерацией выходного XML. Как Вы сказали, выдавался результат в юникоде ? не смотря на то, что перед этим парсился документ с указанной кодировкой ? windows-1251 (причем, парсился он в корректной кодировке; хотя, может быть, мне показалось). Не помню как обходил проблему, первое, что сейчас приходит в голову, ? функции iconv?

да так и решал - через iconv, причем сайт в кодировке win-1251, потому приходилось конвертить полученные POST, GET из win-1251 в utf-8

посему следующие проекты решил делать только на utf-8 :)

З.Ы.

сейчас вроде ведутся работы в шестой версии: обрабатывают все функции на корректность работы с юникодом

спс. там будет видно :)

Link to comment
Share on other sites

  • 0

Здравствуйте.

Видимо, проблема в моем браузере - в том, как он воспринимает приходящие xml-ы.

Сделал след.код:

<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';

echo '<response>';
$name = "Имя";
echo 'Здравствуйте, ' . $name . '!';
echo '</response>';
?>

Адрес скрипта (сохранен в кодировке win1251) - http://manuke.h18.ru/xml_test1.php

Что вижу -

xml_screen_1.gif

Вариант скрипта - без первой строчки, хедера: http://manuke.h18.ru/xml_test1a.php

Вижу -

xml_screen_1a.gif

То есть тег response заполнен и закрыт, но заполнен абракадаброй.

Первый вариант в кодировке Unocode: http://manuke.h18.ru/xml_test2.php

Что вижу -

xml_screen_2.gif

Второй вариант в кодировке Unicode: http://manuke.h18.ru/xml_test2a.php

Вижу то же самое.

Результаты одинаковые и в Денвере, и на хостинге Агавы.

Win98, IE6.0 SP1

Как это исправить?

update: попробовал зайти по опубликованным ссылкам. Интересное наблюдение: с первого захода все отображается как надо, если перезагрузить страницу через F5 - опять та же бодяга...

Link to comment
Share on other sites

  • 0

Sectronix

404 not found =(

Yarik Voronov

Под генерацией, я подразумевал создание XML документа библиотеками РНР, когда для разбора и анализа требуется создать DOM структуру XML документа, а не просто выдать его методом echo, print

Можно об этом подробнее? я правильно понял, что создание xml через echo - некорректный способ?

Link to comment
Share on other sites

  • 0
Можно об этом подробнее?

XXX. DOM Functions

XXXI. DOM XML Functions

я правильно понял, что создание xml через echo - некорректный способ?

смотря для чего. применительно к данному случаю, имхо, оптимально echo. (кстати говоря, интересная идея, в определенных случаях здорово экономит время и ресусы)

так же проверь в других браузерах.

http://a-center.ru/sands/ajax/index.html - тест прогон на хостере твоего кода в моей редакции :) (исходники http://slil.ru/24419370)

а про агаву ничего хорошего увы сказать не могу, сами съезжаем...

Link to comment
Share on other sites

  • 0

спасибо ))

В общем, похоже моя проблема в самом xml. Разобрал еще несколько примеров из книги - там, где его нет, все работает отлично.

Буду читать.

http://a-center.ru/sands/ajax/index.html - тест прогон на хостере твоего кода в моей редакции (исходники http://slil.ru/24419370)

Спасибо, работает и по вашей ссылке, и на локалке =)

Посмотрел на quickstart.php - у вас перекодированы только русские символы, вс? остальное без изменений.

Когда я сохраняю свой php через Вордпад "как документ Unicode" - у меня получается такая вот лабуда:

5c7fae49c0c5.gif

Естественно, такой пхп отказывается работать... то есть вообще не воспринимается системой и не обрабатывается как пхп.

Чем можно корректно сохранять в UTF-8?

а про агаву ничего хорошего увы сказать не могу, сами съезжаем...

Угум...

не подскажете бесплатный хостинг с php и mysql?

я пока нашел только 100mb.com, но он англоязычный.

Link to comment
Share on other sites

  • 0

пришлось провести небольшое расследование.

Дано: текстовый файл data.txt, получаемый генерацией из БД скриптом(в обычной ANSI кодировке) со строкой текста, на кириллице.

делаем: response = loadHTML('data.txt');

document.getElementById('layer').innerHTML = response;

Ес-сессно, на экране вс? "в-квадратиках"

Решение проблемы (не хотелось с громоздким XML кодом "заморачиваться")):

1. перекодировка response средствами класса String по-байтно

перелазил все форумы, так ничего и не понял :)

2. получение уже готовых "к употреблению данных" (в кодировке Cp-1251,utf8 - не важно)

Используя редактор FAR, Блокнот, Wordpad и Excel выяснил:

сохраняем русский текст в

Блокноте(сохр. как ANSI):

смотрим HEX-код Фаром: (char символ=1byte) header='' E4 E2 E5...

( формат [char])

Блокнот и Wordpad (Unicode): (wchar=2byte) 'FF FE' 34 04 32 04

( формат [char 04])

Блокнот (Unicode BE): (wchar=2byte) 'FE FF' 04 34 04 32

( формат [04 char])

Excel (UTF8) (wchar=2byte) 'EF BB' BF D0 B4 D0

( формат [char D0/1]) и вот эта кодировка выдала читый-русский язык на экран, без всяких "танцев -с-бубном")) (пример работы на сайте vean.ru)

Вот вам, пользуйтесь, хотя я так подумал.. а зачем тогда вообще БД, когда можно теперь хранить данные, прямо в файле? :)

по -хостингу: есть халява(200 мег, база, пхп) для желающих создавать интересные проекты, пишите viipru@mail

Link to comment
Share on other sites

  • 0

_dreamer

спасибо )) интересный способ, никогда не пользовался побайтным редактированием) попробую.

Интересных проектов, увы, пока нет... тренируюсь только...

В общем, проблема решена - Wordpad сохраняет в UTF-16, т.е. на каждый символ по два байта.

теперь я прогоняю отдаваемый скриптом текст через перекодировку -

$bufer2 = iconv ('cp1251', 'utf-8', $bufer);

- и все работает.

Link to comment
Share on other sites

  • 0

Ковыряюсь с этим же примером, благодаря вам с кодировками все заработало. Пытаюсь привязать к нему базу данных, но ничего не получается. Скрипт берет введенное значение-индекс и пытается найти город с таким названием. Про фильтры и остальное знаю, я просто пытаюсь заставить заработать ajax. База на firebird - не пугайтесь :)

Меняю только php скрипт примерно так:

include ('config.php'); - хранит переменные подключения к БД

header('Content-Type: text/xml');

// generate XML header

echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';

// create the element

echo '';

$name=$_GET('name');

$ibase = ibase_connect(DB_HOST, DB_USER, DB_PASSWORD);

$query = 'Select CITY from POSTOFF where PO_IND like '$name'';

$result = ibase_query($ibase, $query);

while ($row = ibase_fetch_assoc($result))

$output = $row["CITY"];

echo 'Это индекс города, ' . $output . '!';

else if (trim($output) == '')

echo 'Введите индекс!';

// close the element

echo '';

само подлючение к БД работает, что-то не то или в кодировке, или в самом принципе. Остальные файлы не меняла. HELP!!!

Link to comment
Share on other sites

  • 0

Так...

у меня сработал такой скрипт (но я работаю с мускулом):

<?php
include "config.php";
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
echo '<response>';

$name = 30;

$query = mysql_query("SELECT po_ind, city FROM postoff WHERE po_ind LIKE '$name'");
while ($row = mysql_fetch_object($query))
{
$text = "Это индекс города, " . $row->city . "!";
echo iconv("windows-1251", "utf-8", $text);
}

echo '</response>';

include "out.php";
?>

То есть, во первых, не забыть про iconv, во-вторых при выборке из базы указывать и тот параметр, по которому она производится =) Без него выборка будет нулевой.

И тестируйте сначала "голый" пхп; если он отдаст правильный xml - только тогда переходите к аяксу...

PS: да, в денвере с пхп-4.4.4 iconv почему-то не работает. Хотя по мануалу - должен с 4.0.5.

Php_iconv.dll включен.

Link to comment
Share on other sites

  • 0

Не работает :)

пхп скрипт выдает при подстановке индекса в скрипт, как у тебя

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

ТЕЛЬНОВСКИЙ - так и должно быть, как я понимаю

а дальше самое, php 5.0.4 и iconv включен ???

Link to comment
Share on other sites

  • 0

У меня денвер, версия 4.4.4. и надстройка 5.0.4.

В четверке iconv не работает; включил в php.ini - бестолку. В пятерке - работал изначально.

Если ты видишь этот текст, с заполненным и закрытым - значит, скрипт работает правильно, xml валидный... вероятно, неправильно обрабатывается уже в яваскрипте.

Мой рабочий пример - http://slil.ru/24440972

Link to comment
Share on other sites

  • 0

вдогонку, совет - Mozilla это не только браузер, как думают чайники.. Загляните в Инструмменты(Tools) там, помимо разных полезностей найд?тся JSC (Java script console) -

живой отладчик js, css! кода, который, уверен, поможет сэкономить вам очень много полезного времени, на тему - где же у меня ошибка.. в 100кб кода??.. :)) аякс, ведь дружит с js..

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy