САМОУЧИТЕЛЬ PHP 4

       

Передача параметров методом POST


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

Следует заметить очень важную деталь: то, что был использован метод POST, вовсе не означает, что не был применен также и метод GET. Иными словами, метод POST

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

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

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

Листинг 3.3. Получение данных 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-файл с формой:

Листинг 3.4. 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 используется чаще, особенно если нужно передавать большие объемы данных или "закачивать"

файл на сервер (эта возможность также поддерживается протоколом HTTP и HTML).


Содержание раздела