|
ые (хоть это и не совсем осмысленно, но выполняем
// сразу для всех POST-данных, не разбивая их на параметры)
UrlDecode(Data);
// выводим заголовок
printf("Content-type: text/html\n\n");
// выводим документ
printf("");
printf("Здравствуйте. Мы знаем о Вас все!");
printf("Ваш IP-адрес: %s ",RemoteAddr);
printf("Количество байтов данных: %d ", NumBytes);
printf("Вот параметры, которые Вы указали: %s ",Data);
printf("А вот то, что мы получили через URL: %s",
QueryString);
printf("");
}
Обратите внимание на строки, выделенные жирным шрифтом. Теперь мы используем
промежуточный буфер для хранения QUERY_STRING. Зачем? Попробуем поставить
все на место, т. е. не задействовать промежуточный буфер, а работать с
переменной
окружения напрямую, как это было в листинге 3.5. Тогда в одних операционных
сис-
темах этот код будет работать прекрасно, а в других — генерировать ошибку общей
защиты, что приведет к немедленному завершению работы сценария. В чем же дело?
Очень просто: переменная QueryString ссылается на значение переменной окруже-
ния QUERY_STRING, которая расположена в системной области памяти, а значит,
дос-
тупна только для чтения. В то же время функция UrlDecode(), как я уже замечал,
помещает результат своей работы в ту же область памяти, где находится ее
параметр,
что и вызывает ошибку.
Чтобы избавиться от указанного недостатка, мы и копируем значение переменной
окружения QUERY_STRING в область памяти, доступной сценарию для записи — на-
пример, в какой-нибудь буфер, а потом уже преобразовываем его. Что и было
сделано
в последнем сценарии.
Часть I. Основы Web-программирования 56
Несколько однообразно и запутанно, не так ли? Да, пожалуй. Но, как говорится,
"это
даже хорошо, что пока нам плохо" — тем больше будет причин предпочитать PHP
другим языкам программирования (так как в PHP эти проблемы изжиты как класс).
Формы
До сих пор из всех полей формы мы рассматривали только текстовые поля и кнопки
отправки (типа submit). Давайте теперь поглядим, в каком виде приходят данные и
от других элементов формы (а их существует довольно много).
Все элементы формы по именам соответствующих им тэгов делятся на 3 категории:
r
r ...
r ......
Каждый из этих тэгов, конечно, может иметь имя. Ранее уже упоминалось, что пары
имя=значение перед тем, как отправятся сценарию, будут разделены в строке пара-
метров символом &. Кроме того, следует учитывать, что для тех компонентов формы,
у тэгов которых не задан параметр name, соответствующая строка имя=значение
передана не будет. Это ограничение введено для того, чтобы можно было в форме
определять служебные элементы, которые не будут посылаться сценарию. Например,
в их число входят кнопки (подтверждения отправки или обычные, используемые при
программировании на JavaScript) и т. д. Так, создадим форму:
Несмотря на то, что кнопка Go! формально является полем ввода, ее данные не
будут
переданы сценарию, поскольку у нее отсутствует параметр name.
Чаще все же бывает удобно давать имена таким кнопкам. Например, для того, чтобы
определить, каким образом был запущен сценарий — путем нажатия на кнопку или
как-то еще (например, просто набором его URL в браузере). Создадим следующую
форму:
|
|