Пришло время вспомнить пример, где мы выполняли запросы GET с помощью скрытого фрейма, чтобы посмотреть, как то же самое мож¬но сделать с помощью объекта XMLHttp. Сначала изменим сценарий GetCustomerData. php, чтобы он просто возвращал отрывок кода HTML. Теперь сценарий стал проще:: headeг("Content-Туре: text/plain");
$sID = $_GET["id"]; $sInfo = "";
SsDBServer = "your.databaser.server";
SsDBName = "имя_базы_данных";
SsDBUsername = "имя_пользователя_базы данных";
$sDBPassword = "пароль_пользователя_базы данных";
$sQuery = "Select from Customers where CustomerId=".$sI0;
SoLink = mysql_connect($sDBServer,SsDBUsername, SsDBPassword);. @mysql_select_db($sDBName) or $sInfo="Heвoзмoжнo открыть базу данных";
if($oResult = mysql_query($sQuery) and mysql_num_rows($oResult) > 0) { SaValues = mysql_fetch_array($oResult,MYSQL_ASSOC); Sslnfo = $aValues['Name']. "".$aValues['Address']. "".
$aValues['City']. "".$aValues['State']. "".
$aValues['Zip']. "Телефон: ".$aValues['Phone'].
"". "".
$aValues['E-mail']."";
} else {
Sslnfo = "Клиент с идентификатором $sID не найден.";
}
Как видите, здесь нет видимого кода HTML и вызова функции Jav Script. Логика работы практически не изменилась, но добавились д строки кода РНР. Первая находится в начале сценария, где вызыва-ся функция header(), определяющая тип содержимого страницы. Сц нарий возвращает фрагмент кода HTML, но лучше все-таки опред лять тип как text/plain, поскольку страница содержит не только к HTML (и, таким образом, не может считаться полноценной страниц HTML). Следует всегда указывать тип содержимого любой страниц которая передается броузеру не как HTML. Вторая дополнительн строка находится в конце сценария, она выводит содержимое переме ной $slnf о в поток стандартного вывода с помощью команды echo.
Основа главной страницы HTML осталась без изменений:
<р>Чтобы получить информацию о клиенте, введите его
идентификационный номер: ^Идентификационный номер:
Функция requestCustomerlnfoO в более раннем примере создавала скрытый плавающий фрейм, но теперь нам надо изменить ее, чтобы можно было работать с объектом XMLHttp:
function requestCustomerlnfoO {
var sld = document.getElementByldC'txtCustomerld").value; var oXmlHttp = zXmlHttp. сreateRequestQ; oXmlHttp.open("get", "GetCustomerData.php?ia=" + sld, true); . oXmlHttp. on readystatechange = furicSiibnT(;);v^:ttMi^;;' if (oXmlHttp.readyState == 4) { ., if (oXmlHttp. status == 200) {
.•; displayCustomerlnfo(oXmlHttp. responseText); > else {
displayCustomerlnfo("Ошибка: " + oXmlHttp.statusText);
Обратите внимание: функция начинается, как и прежде, с получения идентификационного номера клиента, введенного пользователем. За¬тем с помощью функции из библиотеки zXml создается объект XMLHttp. Далее вызывается метод open О, которому указывается, что должен быть выполнен асинхронный запрос типа GET к странице GetCustomer-Data. php (к имени страницы добавлена строка запроса, содержащая вы¬шеупомянутый идентификатор). Затем назначается обработчик собы¬тия, который будет проверять, установлено ли в свойстве readyState значение 4, и после этого проверит код статуса запроса. Если код стату¬са говорит об успешном получении ответа (свойство status содержит значение 200), вызывается функция displayCustomerlnfо(), которой пе¬редается тело ответа (полученное из свойства responseText). Если же воз¬никла какая-либо ошибка (свойство status содержит значение, отлич¬ное от 200), то функции displayCustomerlnf о() передается код ошибки.
Между этим примером и примерами на базе скрытых фреймов сущест¬вует несколько различий. Первое: отпала необходимость в коде Java¬Script за пределами главной страницы. Это очень важно, потому что необходимость размещать код сценариев в разных файлах чревата рис¬ком несовместимости. В примерах, построенных на основе скрытых фреймов, имелась зависимость между различными сценариями, распо¬ложенными в разных фреймах и взаимодействующими друг с другом.
Упростив сценарий РНР, который теперь возвращает только те дан¬ные, что нам необходимы, мы избавились от потенциальной проблемы с кодом JavaScript, размещаемым в двух разных местах. Второе отлв? чие состоит в том, что теперь стало намного проще обнаруживай ошибки выполнения запроса. В наших предыдущих сценариях отсут¬ствовал механизм, который позволял бы обнаружить ошибку сервер! и среагировать на нее. Благодаря XMLHttp все ошибки сервера легко обна руживаются и можно предоставлять пользователю сообщения об ошиб ках, более наполненные смыслом. Во многих отношениях XMLHttp - эя более элегантное решение, чем применение скрытых фреймов для вы полнения запросов HTTP.