Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.28 Mб
Скачать

1.3 Передача информации cgi-сценарию

Непосредственно перед запуском сценария сервер передает ему переменные окружения, в которых содержатся некоторые заголовки.

Переменные окружения:

  • HTTP_ACCEPT

В этой переменной перечислены все MIME-типы данных, которые могут быть восприняты браузером. Строка */* означает любой тип.

  • HTTP_REFERER

Задает имя документа, в котором находится форма, запустившая CGI-сценарий.

  • HTTP_USER_AGENT

Идентифицирует браузер пользователя. Если в данной переменной окружения присутствует подстрока MSIE, то это – Internet Explorer, в противном случае, если в наличии лишь слово Mozilla, – Netscape.

  • HTTP_HOST

Доменное имя Web-сервера, на котором запустился сценарий.

  • SERVER_PORT

Порт сервера (обычно 80), к которому обратился браузер пользователя.

  • REMOTE_ADDR

Переменная окружения задает IP-адрес (или доменное имя) узла пользователя, на котором был запущен браузер.

  • REMOTE_PORT

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

  • SCRIPT_NAME

Виртуальное имя выполняющегося сценария (то есть часть URL после имени сервера, но до символа ?).

  • REQUEST_METHOD

Метод, который применяет пользователь при передаче данных.

  • QUERY_STRING

Параметры, которые в URL указаны после вопросительного знака. Они доступны как при методе GET, так и при методе POST (если они были определены в атрибуте action тэга <form>).

  • CONTENT_LENGTH

Количество байтов данных, присланных пользователем. Эту переменную необходимо анализировать, если нужно принять и обработать POST-формы.

Передача параметров методом GET. Все параметры передаются единой строкой (точно такой же, какая была задана в URL после ?) в переменной QUERY_STRING. Все данные поступят URL-кодированными. Для того чтобы узнать значения полученных переменных в Си, нужно воспользоваться функцией getenv().

Пример сценария на Си, работающего с переменными окружения:

#include <stdio.h> // Включаем функции ввода/вывода

#include <stdlib.h> // Включаем функцию getenv()

void main(void) {

// получаем значение переменной окружения REMOTE_ADDR

char *RemoteAddr = getenv("REMOTE_ADDR");

// ... и еще QUERY_STRING

char *QueryString = getenv("QUERY_STRING");

// печатаем заголовок

printf("Content-type: text/html\n\n");

// печатаем документ

printf("<html><body>");

printf("<h1>Здравствуйте. Я знаю все!</h1>");

printf("Ваш IP-адрес: %s<br>",RemoteAddr);

printf("Указанные параметры: %s",QueryString);

printf("</body></html>");

}

Откомпилируем сценарий и поместим его в «CGI-каталог». Теперь в адресной строке введем:

http://www.myhost.com/cgi-bin/script.cgi?a=1&b=2

Получим примерно такой документ:

Здравствуйте. Я знаю все!

Ваш IP-адрес: 192.232.01.23

Указанные параметры: a=1&b=2

Передача параметров методом POST. В отличие от метода GET, параметры передаются сценарию не через переменные окружения, а через стандартный поток ввода (в Си он называется stdin). То есть программа должна работать так, будто никакого сервера не существует, а она читает данные, которые вводит пользователь с клавиатуры.

Замечание: То, что был использован метод POST, вовсе не означает, что не был применен также и метод GET. Метод POST подразумевает также возможность передачи данных через URL-строку. Эти данные будут помещены в переменную окружения QUERY_STRING.

Для того, чтобы узнать, сколько именно данных переслал пользователь методом POST, служит переменная окружения CONTENT_LENGTH, в которой хранится строка с десятичным представлением числа переданных байтов данных (перед использованием ее надо перевести в обычное число).

Модифицируем предыдущий пример так, чтобы он принимал POST-данные, а также выводил и GET-информацию, если она задана:

Пример получения данных POST

#include <stdio.h>

#include <stdlib.h>

void main(void) {

// извлекаем значения переменных окружения

char *RemoteAddr = getenv("REMOTE_ADDR");

char *ContentLength = getenv("CONTENT_LENGTH");

char *QueryString = getenv("QUERY_STRING");

// вычисляем длину данных — переводим строку в число

int NumBytes = atoi(ContentLength);

// выделяем в свободной памяти буфер нужного размера

char *Data = (char *)malloc(NumBytes + 1);

// читаем данные из стандартного потока ввода

fread(Data, 1, NumBytes, stdin);

// добавляем нулевой код в конец строки

// (в Си нулевой код сигнализирует о конце строки)

Data[NumBytes] = 0;

// выводим заголовок

printf("Content-type: text/html\n\n");

// выводим документ

printf("<html><body>");

printf("<h1>Здравствуйте. Я знаю все!</h1>");

printf("Ваш IP-адрес: %s<br>",RemoteAddr);

printf("Количество байтов данных: %d<br>",NumBytes);

printf("Указанные параметры: %s<br>",Data);

printf("А вот то, что мы получили через URL: %s",

QueryString);

printf("</body></html>");

}

Транслируем этот сценарий и запишем то, что получилось, под именем script.cgi в каталог, видимый извне как /cgi-bin/. Откроем в браузере следующий HTML-файл с формой:

Пример POST-формы:

<html><body>

<form action=/cgi-bin/script.cgi?param=value

method=post>

Name1: <input type=text name="name1"><br>

Name2: <input type=text name="name2"><br>

<input type=submit value="Запустить сценарий!">

</form>

</body></html>

Теперь, если набрать в полях ввода какой-нибудь текст и нажать кнопку, получим HTML-страницу, сгенерированную сценарием, например, следующего содержания:

Здравствуйте. Я знаю все!

Ваш IP-адрес: 136.234.54.2

Количество байтов данных: 23

Указанные перематры: name1=Vasya&name2=Petya

А вот то, что мы получили через URL: param=value

Обработка метода POST устроена сложнее, чем GET. Тем не менее, метод POST используется чаще, особенно если нужно передавать большие объемы данных или «закачивать» файл на сервер.

Если бы в предыдущем примере ввели параметры, содержащие, например, буквы кириллицы, то сценарию они бы поступили в URL-закодированном виде, поэтому дополнительно еще нужно было бы написать функцию расшифровки URL-кодированных данных. (Кодирование заключается в том, что некоторые неалфавитно-цифровые символы, в том числе и «русские» буквы, преобразуются в форму %XX, где XX – код символа в шестнадцатеричной системе счисления).