В предыдущем примере для получения информации из базы данных применялся запрос типа GET. Выполнять такие запросы достаточно просто, потому что идентификационный номер клиента просто добавля¬ется к URL в конец строки запроса и в таком виде отправляется серверу. Но что делать, если возникает необходимость посылать запрос POST? Применение скрытых фреймов позволяет сделать и это, хотя в этом случае и приходится приложить некоторые дополнительные усилия.
Обычно запросы типа POST применяются для передачи некоторых данных серверу, в противоположность запросу GET, который служит лишь для того, чтобы запросить данные у сервера. Хотя запросы GET и позволяют передавать дополнительные данные в виде строки запро¬са, но некоторые броузеры могут обрабатывать строки запроса длиной не более 512 Кбайт. Запросы типа POST позволяют передавать инфор¬мацию объемом до 2 Гбайт, чего с лихвой хватит практически на все случаи жизни.
Традиционно запросы POST передавались с помощью форм, атрибуту method которых присвоено значение post. В этом случае данные, содер¬жащиеся в форме, передаются методом POST по URL, указанному в ат¬рибуте action. Положение дел осложняется еще больше тем, что в ре¬зультате отправки формы происходит автоматический переход к но¬вой странице по указанному URL. Это никак не согласуется с целями, преследуемыми Ajax. К счастью, есть достаточно простой способ обой¬ти это препятствие с помощью малоизвестного атрибута target.
Атрибут target элемента используется аналогично атрибуту target элемента <а />: он указывает, куда должны быть возвращены ре¬зультаты обработки отправленной формы. Установив в атрибуте target адрес скрытого фрейма, вы фактически прикажете главной странице остаться на месте, в то время как результаты обработки отправленной формы будут отображены в другом фрейме или окне (в данном случае в скрытом фрейме).
Для начала мы определим еще один набор фреймов. Единственное его отличие от предыдущего примера в том, что видимый фрейм содержит форму для ввода информации о клиенте:

• •«.-iv."-y

Сама форма ввода находится в пределах элемента и содержит текстовые поля ввода для каждого из полей, хранимых в базе данных (исключение составляет идентификационный номер клиента, кото¬рый будет сгенерирован автоматически). Кроме того, на странице присутствует элемент , предназначенный для вывода информации, имеющей отношение к взаимодействию между клиентом и сервером Обратите внимание, что в атрибуте target элемента указан ад¬рес, задаваемый значением "hiddenFrame", поэтому, когда пользователь щелкнет по кнопке, данные, полученные от сервера в результате обра¬ботки формы, будут переданы в скрытый фрейм.
В этом примере нам понадобится всего одна функция JavaScriptHa глав¬ной странице: saveResult(). Эта функция будет вызываться, когда в скрытый фрейм придут результаты обработки формы от сервера:
function saveResult(sMessage) { т: . -\ var dtvStatus = document.getElementById("divStatus"); divStatus.innerHTML = "Запрос выполнен: "■+ sMessage:

Скрытый фрейм будет передавать в эту функцию сообщение, получен¬ное от сервера. Это будет либо подтверждение успешной записи инфор¬мации в БД, либо сообщение об ошибке, объясняющее, почему инфор¬мация не может быть сохранена.
Далее рассмотрим серверный сценарий SaveCustomer. php, который обра¬батывает полученный запрос POST. Как и в предыдущем примере, этот сценарий оформлен в виде страницы HTML, включающей в себя код РНР и JavaScript. Код РНР выполняет выемку информации из запроса и сохраняет ее в базе данных. Поскольку передача выполняется запро¬сом POST, все переданные данные будут находиться в массиве $_P0ST:
Этот фрагмент кода извлекает все сведения о клиенте, описывает пере¬менную, в которой будет храниться сообщение с результатом обработки данных формы (SsStatus), и всю информацию, необходимую для работы с базой данных (та же самая информация фигурировала в предыдущем примере). Выражение SQL на этот раз представлено оператором INSERT, который записывает всю полученную информацию в базу данных.
Программный код, исполняющий запрос, очень похож на код преды¬дущего примера:
<?php
SsName = $_POST["txtName"]; SsAddress = $_POST["txtAddress"]; SsCity = $_POST["txtCity"]; SsState = $_POST["txtState"]; SsZipCode = $_POST["txtZipCode"]; SsPhone = $_POST["txtPhone"]; SsEmail = $_POST["txtEmail"];
SsStatus = "";
SsDBServer = "your.database.server";
SsDBName = "имя_базы_данных";
SsDBUsername = "имя_пользователя_базы_данных";
SsDBPassword = "пароль_пользователя_базы_данных";
SsSQL = "Insert into Customers(Name,Address,City,State,Zip,Phone, ".
"'E-mail') ".
" values ('SsName', 'SsAddress', 'SsCity', 'SsState', ". "'SsZipCode','SsPhone', 'SsEmail') ";
SoLink = mysql_connect(SsDBServer,SsDBUsername,SsDBPassword); @mysql_select_db($sDBName) or SsStatus = "Невозможно открыть базу данных";
Здесь по результату работы функции mysql_query() можно судить, на¬сколько успешно была выполнена запись данных в базу. В случае ус¬пеха в переменную $sStatus записывается сообщение об успешном за¬вершении операции с указанием идентификационного номера нового клиента. Функция mysql_insert_id() всегда возвращает последнее зна¬чение автоинкрементного поля, полученное в результате выполнения последнего оператора INSERT. Если по каким-либо причинам исполне¬ние оператора потерпело неудачу, в переменную $sStatus записывается сообщение об ошибке.
Значение переменной $sStatus выводится в строку вызова функции JavaScript, которая запускается после загрузки страницы в окно:

window.onload = function () {
top.frames["displayFrame"].saveResult("<?php echo SsStatus ?>");
>

Этот код вызывает функцию saveResult(), описанную в видимом фрей¬ме, и передает ей значение переменной РНР - SsStatus. Эта переменная содержит строку, поэтому необходимо окружить оператор echo языка РНР двойными кавычками. Когда эта функция завершит работу, стра¬ница с формой ввода информации будет выглядеть примерно так, как показано на рис. 2.3 (если исходить из предположения, что запись данных в базу прошла успешно).
Когда этот код завершит работу, вы сможете добавить в базу данных информацию о других клиентах, взяв ту же самую форму ввода, пото¬му что она никуда не исчезнет с экрана.