Пришло время вспомнить пример, где мы выполняли запросы GET с помощью скрытого фрейма, чтобы посмотреть,как то же самое можно сделать с помощью объекта XMLHttp. Сначала изменим сценарий GetCustomerData. php, чтобы он просто возвращал отрывок кода HTML
Теперь сценарий стал проще:
<?php
header("Content-Type: text/plain");
$sID = $_GET["id"];
$slnfo = "";
$sOBServer = "your.databaser.server";
$sDBName = "имя_базы_данньх";
$sDBUsername = "имя_пользователя_базы данных";
$sDBPassword = "пароль_пользователя_базы данных";
$sQuery = "Select * from Customers where CustomerId=".$sID;
$oLink = mysql_connect($sDBServer,SsDBUsername,SsDBPassword);
@mysql_select_db($sDBName) or $зШо="Невозможно открыть базу данных"
if($oResult = mysql_query($sQuery) and mysql_num_rows($oResult) > 0) {
$aValues = mysql_fetch_array($oResult,MYSQL_ASS0C);
$slnfo = $aValues['Name']. " ".
$aValues['Address']. "".
$aValues['City']. "".$aValues['State']. "".
$aValues['Zip']. "Телефон: ",$aValues['Phone'].
"". "".
$aValues['E-mail']."";
= "Клиент с идентификатором $sID не найден.";
} else {
$sInfo
}
mysql_close($oLink);
echo Sslnfo;
?>
Как видите, здесь нет видимого кода HTML и вызова функции JavaScript. Логика работы практически не изменилась, но добавились две строки кода РНР.
Первая находится в начале сценария, где вызывает
ся функция header(), определяющая тип содержимого страницы. Сценарий возвращает фрагмент кода HTML, но лучше все-таки определять тип как text/plain, поскольку страница содержит не только код HTML (и, таким образом, не может считаться полноценной страница
HTML). Следует всегда указывать тип содержимого любой страницу которая передается броузеру не как HTML. Вторая дополнительная строка находится в конце сценария, она выводит содержимое перемен ной Sslnfo в поток стандартного вывода с помощью команды echo.
Основа главной страницы HTML осталась без изменений:
<р>Чтобы получить информацию о клиенте, введите его
идентификационный номер:
<р>Идентификационный номер:
Функция requestCustomerlnfo() в более раннем примере создавала скрытый плавающий фрейм, но теперь нам надо изменить ее, чтобы можно было работать с объектом XMLHttp:
function requestCustomerlnfo() {
var sId = document.getElementByldC'txtCustomerld").value;
var oXmlHttp = zXmlHttp.сreateRequest();
oXmlHttp.open("get", "GetCustomerData.php?ia=" + sId, true);
oXmlHttp.onreadystatechange = function (){
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
displayCustomerInfo(oXmlHttp. responseText);
} else {
displayCustomerInfo("Ошибка: " + oXmlHttp.statusText);
}
}
};
oXmlHttp.send(null);
}
Обратите внимание: функция начинается, к а к и прежде, с получения идентификационного номера клиента, введенного пользователем. Затем с помощью функции из библиотеки zXml создается объект XMLHttp.
Далее вызывается метод ореп(), которому указывается, что должен быть выполнен асинхронный запрос типа GET к странице GetCustomer-Data.php (к имени страницы добавлена строка запроса, содержащая вышеупомянутый
идентификатор). Затем назначается обработчик события,
который будет проверять, установлено ли в свойстве readyState значение 4, и после этого проверит код статуса запроса. Если код статуса говорит об успешном получении ответа (свойство status содержит значение 200), вызывается функция displayCustomerlnfoO, которой передается тело ответа (полученное из свойства responseText). Если же возникла какая-либо ошибка (свойство status содержит значение, отличное от 200), то функции displayCustomerInfo() передается код ошибки.
Между этим примером и примерами на базе скрытых фреймов существует несколько различий. Первое: отпала необходимость в коде JavaScript за пределами главной страницы. Это очень важно, потому что необходимость размещать код сценариев в разных файлах чревата риском
несовместимости. В примерах, построенных на основе скрытых фреймов, имелась зависимость между различными сценариями, расположенными в разных фреймах и взаимодействующими друг с другом.
Упростив сценарий РНР, который теперь возвращает только те данные, что нам необходимы, мы избавились от потенциальной проблем:
с кодом JavaScript, размещаемым в двух разных местах. Второе отличие состоит в том, что теперь стало намного проще обнаруживай ошибки выполнения запроса. В наших предыдущих сценариях отсутствовал механизм, который позволял бы обнаружить ошибку сервера и среагировать на нее. Благодаря XMLHttp все ошибки сервера легко обнаруживаются и можно предоставлять пользователю сообщения об ошибках, более наполненные смыслом. Во многих отношениях XMLHttp - это более элегантное решение, чем применение скрытых фреймов для вы
по л нения запросов HTTP.