Методичка: Разработка Web-приложений

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Разберём заголовок. Он начинается с названия протокола "HTTP/1.1", после чего идёт пробел, затем - код возврата "200 OK". После кода возврата идёт символ переноса строки.

Коды ответов сервера

Вот основные коды возврата, определённые для серверов:

Коды с номером типа 1xx: информационный - запрос послан, идёт процесс:

· "101 Switching Protocols" - переключение протокола

Коды с номером типа 2xx: удачное завершение - запрос полностью послан, прочитан/понят сервером и принят им:

· "200 OK" - запрос успешно получен, понят, принят и выполнен

· "201 Created" - создано

· "202 Accepted" - принято

· "203 Non-Authoritative Information" - нерабочая информация

· "204 No Content" - нет информации к ответу

· "205 Reset Content" - очистка ответа

· "206 Partial Content" - выдаётся запрошенная часть документа (см. "Range-Unit" в запросе клиента)

Коды с номером типа 3xx: перенаправление - действие нуждается в уточнении либо просто информационный ответ:

· "300 Multiple Choices" - множественный выбор - по данному запросу обнаружено несколько вариантов документов

· "301 Moved Permanently" - документ переехал

· "302 Found" - найдено

· "303 See Other" - смотри остальные

· "304 Not Modified" - не изменён

· "305 Use Proxy" - используй прокси

· "307 Section" - временное перемещение запроса

Коды с номером типа 4xx: ошибка клиента - запрос клиента имеет либо неправильный синтаксис, либо не понят:

· "400 Bad Request" - плохой запрос

· "401 Unauthorized" - нет авторизации

· "402 Payment Required" - коммерческий ресурс, у вас нет денег на счету

· "403 Forbidden" - запрещение доступа к ресурсу (политика безопасности)

· "404 Not Found" - ресурс не найден

· "405 Method Not Allowed" - метод не поддерживается

· "406 Not Acceptable" - нет доступа к хосту

· "407 Proxy Authentication Required" - для работы с прокси вы должны авторизоваться

· "408 Request Time-out" - слишком долго не было данных с сервера (связь плохая или сервер упал)

· "409 Conflict" - конфликт

· "410 Gone" - процесс идёт (не мешайте)

· "411 Length Required" - требуется длина посылаемых данных

· "412 Precondition Failed" - неправильные умолчания

· "413 Request Entity Too Large" - содержимое запроса слишком велико для этого сервера

· "414 Request-URI Too Large" - слишком длинный адрес запрашиваемого ресурса

· "415 Unsupported Media Type" - в "Accept" не указан поддерживаемый сервером формат данных

· "416 Requested range not satisfiable" - требуемый кусок (с помощью "Range-Unit") имеет неверные размеры

· "417 Expectation Failed" - неожиданная ошибка при разборе запроса (может возникнуть при пересылке типа "multipart/form-data" при неправильном делителе)

Коды с номером типа 5xx: ошибка сервера - сервер не может обработать запрос клиента

· "500 Internal Server Error" - внутренняя ошибка сервера

· "501 Not Implemented" - не применяется (этот запрос не применим)

· "502 Bad Gateway" - "плохие врата" - сервер не обрабатывает запросы с этого сегмента IP

· "503 Service Unavailable" - такой сервис недоступен (к примеру TRACE запрос)

· "504 Gateway Time-out" - слишком долго сервер пытался получить данные, связь плохая

· "505 HTTP Version not supported" - версия HTTP, указанная в запросе, не поддерживается данным сервером

Параметры HTTP ответа

Продолжим разбор параметров заголовка в ответе сервера. Прежде всего упомяну, что параметры "Cache-Control", "Pragma" и "Proxy-Connection" идентичны как для запроса, так и для ответа, по этому всё сказанное про них выше, применимо и тут.

Set-Cookie: name=value; expires=date; path=PATH; domain=HOSTNAME; secure

Не буду подробно останавливаться на этом параметре. Он устанавливает или удаляет cookie и подробно о нём написано вCookie Specification.

Location: http://www.devresource.org

Данный параметр указывает браузеру, что нужно открыть ресурс http://www.devresource.org вместо текущего. В значении этого параметра указывается URI ресурса для перехода.

Date: Mon, 07 Apr 2003 14:51:19 GMT

Параметр показывает дату документа. Это либо текущая дата (если документ динамический), либо дата создания отправляемого файла. Дата представлена в формате GMT.

Last-Modified: Mon, 07 Apr 2003 14:51:00 GMT

Параметр показывает дату последнего изменения документа.

Server: Apache/1.3.20 (Win32) PHP/4.3.0

Параметр содержит имя сервера.

Keep-Alive: timeout=15, max=100

Connection: Keep-Alive

Эти два параметра сообщают, что поддерживается постоянное соединение с сервером (вы противном случае было бы "Connection: close"), что текущее время timeout для сокета сервера составляет 15 секунд и что клиент может изменить это время максимум до 100 секунд.

Accept-Ranges: bytes

Этот параметр существует, чтобы указать клиенту, какая часть документа ему пересылается (в случае присутствия "Range-Unit" в запросе) Параметр этот может содержать значение "bytes", означающее, что пересылается файл целиком.

Так же "none" (или этот параметр может быть просто опущен), означающее, что докачка не используется или не поддерживается, а строка "Accept-Ranges: 1:637" будет означать, что пересылается кусок документа с байта под номером 1 и длиной в 637 байт.

Content-Length: 673

Длина пересылаемого документа.

Content-Type: application/zip

MIME тип пересылаемого документа

Content-Disposition: attachment; filename=test.zip

указывает, что пересылаемый файл имеет название "test.zip"

Accept-Charset: windows-1251

указывает кодировку текста документа (в данном случае - русскую кодировку windows)

Accept-Encoding: compress, gzip

этот параметр используется сервером, чтобы указать клиенту, что документ ему передаётся в сжатом виде (и для сжатия используется стандарт gzip)

Accept-Language: ru

Параметр указывает на язык, использованный сервером для документа. IE6, получивший такой заголовок, к примеру, может переключить раскладку клавиатуры на русскую для текстовых элементов в полученном документе.

Transfer-Encoding: chunked

Данный параметр показывает метод выдачи данных сервером. В данном случае сервер будет выдавать данные по кусочкам, а не всё сразу.

На этом краткое описание HTTP протокола можно считать завершённым.

Задания к работе

1. Чем отличаются методы GET и POST?

2. Создание тестовой системы и счетчика посещений страницы средствами CGI, PHP и СУБД MySQL

3. CGI. Проверка знания таблицы умножения и текстовый счетчик посещения страницы.

4. PHP. Проверка знания таблицы умножения с записью результатов прохождения теста разными пользователями в базу данных.

5. CGI. Любой психологический тест и текстовый счетчик посещения страницы.

6. PHP. Любой психологический тест и вывод результатов в базу данных.

7. CGI. Проверка знания языка HTML и текстовый счетчик посещения страницы.

8. PHP. Проверка знания языка HTML с тематическими вопросами и вывод результатов с процентами успешных ответов по каждой теме в базу данных.

9. CGI. Экзамен по дисциплине и текстовый счетчик посещения страницы.

10. PHP. Экзамен по дисциплине и в результате вывод не только оценки, но и перечня тем с большинством неправильных ответов. Вывод результата по темам в базу данных.

11. CGI. Проверка знания словарного запаса (англ. или нем. или франц.) и текстовый счетчик посещения страницы

12. PHP. Проверка знания словарного запаса (англ. или нем. или франц.) с записью результатов прохождения теста разными пользователями в файл и вывода результатов в базу данных.

Практическое занятие №12

Тема: Суперглобальные массивы

Цель работы: освоение методов работы с ассоциативными массивами средствами языка PHP.

Указание к работе: понять где и когда применяются суперглобальные массивы и понять смысл их применения.

Суперглобальные переменные PHP будут описаны в дальнейшем. Массивы имеют много применений в PHP и программировании в целом.

Этот раздел представил некоторые базовые вопросы массивов PHP и описал некоторые базовые функции: это понадобится при рассмотрении более развитых свойств массивов в следующих разделах.

Константы, как и переменные, являются временным хранилищем значений в памяти.

В отличие от переменных значение константыникогда не изменяется. При объявлении константы используется функция define(), которая требует задать имя константы и значениеэтой константы.

Константам можно присваивать следующие типы данных.

Целые - целые числа или числа без десятичной точки (1, 999, 325812841).

Числа с плавающей точкой -- числа, содержащие десятичную точку (1.11, 2.5, .44).

Строки - текстовая или числовая информация.

Строковые данные всегда заключаются в кавычки ("Hello World", "478-477-5555").

Имена констант PHP в отличие от переменных не начинаются со знака "$". Имена констант обычно записывают в верхнем регистре.

Имена констант могут содержать буквы, цифры и символ подчеркивания ( _ ); они не могут, однако, начинаться с цифры.

Объявление констант показано ниже.

define("STRING_CONSTANT", "This is my string.");

define("NUMERIC_CONSTANT", 5);

В PHP версии 4 и выше введено понятие "суперглобальных" массивов. Эти массивы содержат всю информацию о состоянии сервера и среды выполнения скрипта.

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

Виды суперглобальных массивов

Всего массивов девять. Имена всех массивов записываются заглавными буквами, а начинается имя всегда с "$_" (кроме массива $GLOBALS).

$GLOBALS

Массив содержит ссылки на все переменные, объявленные в данном скрипте. Это ассоциативный массив, в котором имена переменных являются ключами.

$_SERVER

Массив содержит все данные о настройках среды выполнения скрипта и параметры сервера.

$_GET

Список переменных, переданных скрипту методом GET, т.е. через параметры URL-запроса.

$_POST

Список переменных, переданных скрипту методом POST.

$_COOKIE

Массив содержит все cookies, которые сервер установил на стороне пользователя.

$_FILES

Содержит список файлов, загруженных на сервер из формы. Более детально мы рассмотрим этот массив в уроке, посвящённом загрузке файлов на сервер.

$_ENV

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

$_REQUEST

Этот массив объединяет массивы $GET, $POST и $COOKIE. очень часто бывает удобен при обработке пользовательских запросов, но применять его для защищённой обработки данных не стоит.

$_SESSION

Массив содержит все переменные сессии текущего пользователя.

Просмотреть содержимое всех масивов можно в результате вызова функции phpinfo().

Рассмотрим примеры использования глобальных массивов.

$_SERVER

С помощью этого массива можно узнать практически всё о сервере, на котором исполняется скрипт.

Например:

<?php

echo 'параметры сервера:' . "<br />\n";

echo "Операционная система: " .

$_SERVER["OS"] . "<br />\n";

echo "Web-сервер: " .

$_SERVER["SERVER_SOFTWARE"] . "<br />\n";

echo "Имя сервера: " .

$_SERVER["SERVER_NAME"] . "<br />\n";

echo "Адрес сервера: " .

$_SERVER["SERVER_ADDR"] . "<br />\n";

echo "Порт сервера: " .

$_SERVER["SERVER_PORT"] . "<br />\n";

echo "Адрес клиента: " .

$_SERVER["REMOTE_ADDR"] . "<br />\n";

echo "Путь к документам на сервере: " .

$_SERVER["DOCUMENT_ROOT"] . "<br />\n";

echo "Полный путь к текущему скрипту: " .

$_SERVER["SCRIPT_FILENAME"] . "<br />\n";

echo "Имя текущего скрипта: " .

$_SERVER["PHP_SELF"] . "<br />\n";?>

Пользоваться этим массивом нужно аккуратно, т.к. некоторые сервера имеют достаточно специфичные настройки или значения параметров. Иногда это приводит к неприятным ошибкам, которые к тому же очень сложно диагностировать и исправить.

Например, параметры $_SERVER["REQUEST_URI"] и $_SERVER["SCRIPT_NAME"] могут быть не установлены (хотя один из них как правило присутствует).

$_GET и $_POST

В эти массивы помещаются данные, передаваемые скрипту извне (так называемый, пользовательский ввод). В принципе, пользователь может влиять только на эти два массива плюс массив файлов и cookie. И именно поэтому все элементы этих массивов должны тщательно проверяться на допустимые значения.

Например, если пользователь ввёл в строку адреса браузера адрес "http://localhost/index.php?name=Dmitry&fam=Medvedev&jt=president&country=Russia", то массив $_GET надо будет обрабатывать так:

<?php

/*

Предполагаем, что массив $_GET должен

содержать следующие элемены

$_GET['name'] = "Dmitry";

$_GET['fam'] = "Medvedev";

$_GET['jt'] = "president";

$_GET['country'] = "Russia";

*/

// Теперь проверим наличие данных,

// а для недостающих - возьмём пустую строку

$name = (isset($_GET['name']))?

$_GET['name']:' не указано ';

$fam = (isset($_GET['fam']))?

$_GET['fam']:' не указано ';

$jt = (isset($_GET['jt']))?

$_GET['jt']:' не указано ';

$country = (isset($_GET['country']))?

$_GET['country']:' не указано ';

echo "Страна: $country <br />\n";

echo "Фамилия: $fam <br />\n";

echo "Имя: $name <br />\n";

echo "Должность: $jt <br />\n";

?>

Этот скрипт будет устойчиво работать при любом GET-запросе, даже если не будет указан ни один параметр. Если используется метод POST, то достаточно заменить $_GET на $_POST.

А если вам совершенно не важно, откуда получены данные - воспользуйтесь массивом $_REQUEST (см. ниже).