Домой Мода Обработка запросов с помощью PHP. NodeJS. Как обрабатывать POST запросы Обработка http запросов php

Обработка запросов с помощью PHP. NodeJS. Как обрабатывать POST запросы Обработка http запросов php

В этом и следующих разделах будет кратко рассказано о том, как создавать простейшие веб-приложения с использованием PHP. Того, о чем было рассказано в разделе явно недостаточно, чтобы ваше приложение общалось с пользователем и формировало в зависимости от выполненных им действий или введенных им параметров. А чего не хватает? Не хватает знаний о том, как организовать пользовательский ввод данных и передачу этих данных на сервер. Ну а базовые знания о способах программной обработки полученной на сервере информации у вас уже должны быть.

Методы HTTP запросов и их параметры

Любое динамическое веб-приложение формирует ответ пользователю в соответствии с введенными им параметрами или выполненными действиями на стороне клиента. Обращение к серверу чаще всего сводится к двум видам запросов: с использованием метода GET или метода POST. Пару слов о различиях между двумя этими видами запросов.

Метод GET:

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

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

Метод POST:

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

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

Метод GET следует использовать для извлечения содержимого информационного ресурса согласно параметрам, когда не требуется вносить изменения в структуры данных целевого ресурса, а запрос (URL) имеет смысл сохранять в закладках. Скорость выполнения метода GET может быть выше аналогичных запросов с использованием метода POST.

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

Путь к ресурсу?параметр1=значение1&параметр2=значение2&…

Если у вас нет специальной HTML формы для заполнения параметров, то вы можете отладить работу вашего PHP приложения, передавая тестовые параметры прямо в командной строке браузера, например:

Http://сайт/php-samples/sql.php?sql=select * from d_staff

Для обращения к параметрам запроса на стороне сервера следует использовать глобальные массивы $_GET и $_POST соответственно. Если вашему приложению все равно, с использованием какого метода к нему обратились, то следует использовать массив $_REQUEST , который объединяет в себе данные массивов $_GET и $_POST, например, так:

$sql = isset($_REQUEST["sql"]) ? $_REQUEST["sql"] : "";

В этом примере программа определяет, был ли передан параметр “sql”: если да, то присваивает соответствующей переменной его значение, и если нет, то присваивает ей пустое значение.

Определение параметров HTTP запроса через HTML форму

Конечно, определять параметры вручную прямо в командной строке браузера не очень удобно. Такой способ подходит для программного выполнения HTTP запросов при общении веб-приложений между собой. Для того чтобы ввести и осуществить первоначальную проверку данных на стороне клиента следует использовать HTML формы и . Ниже приведен пример простейшей формы, с помощью которой вводится текстовый параметр (значение ), который впоследствии передается на сервер в качестве параметра метода POST.

method ="post" action =’sql.php’ > SQL:

В атрибуте method элемента form указывается метод, определяющий способ передачи данных на сервер (get или post). В атрибуте action указывается php файл , который будет обрабатывать запрос. Если обработчиком должен быть текущий файл, то атрибут action добавлять не нужно. Для всех элементов, чье значение должно быть передано в качестве параметра HTTP запроса следует определить уникальное значение атрибута name . Именно значение атрибута name будет являться индексом в массивах $_GET, $_POST или $_REQUEST (смотрите пример выше). Нажатие на кнопку submit отправляет форму со всеми введенными значениями на сервер.

(дистрибьютив Денвер) и вы научились писать простейшие программы на PHP, то самое время узнать, каким образом браузер (клиент) может делать серверу запросы и получать соответствующие ответы. На примере создания простой HTML-формы мы изучим основные принципы такого взаимодействия.

Если вы уже хорошо разбираетесь в каталогах Денвера, то можете создать любой PHP-файл в удобной для вас директории и приступить непосредственно к написанию кода. Для тех, кто еще не уверен в своих силах, советую поступить следующим образом: на виртуальном диске с Денвером (обычно это Z) в папке home создайте папку lessons . Далее, в этой папке создайте еще одну папку – www . Это ваша рабочая папка проекта, которая будет доступна из строки адреса браузера. Перезагрузите Денвер, чтобы созданный хост прописался в системе. Наконец, в папке www создайте файл index.php . Это и будет основной файл с вашим кодом.

Как видите – это обычная HTML-разметка, однако мы назвали файл index.php , а это значит, что теперь в документ мы можем вставлять любые инструкции на языке PHP.

Если вы теперь зайдете в браузере по адресу http://lessons/ , то увидите такой результат:

Заполните поля (например: имя – Вася, год рождения – 1990) и нажмите на кнопку "отправить". Что вы видите? А ничего! Опять та же форма, только пустая. Однако не спешите огорчаться – взгляните на адресную строку браузера. Она изменилась и теперь выглядит примерно вот так:

Http://lessons/index.php?user_name=Вася&user_year=1990&submit_form=отправить

А это значит, что сервер все-таки получил ваши данные!

Давайте теперь разберемся.

Метод GET

Во-первых, что вообще такое HTML-форма? Это интерфейс, позволяющий отправлять какие-либо данные с браузера клиента на сервер. Взгляните на атрибуты вашей формы:

Атрибут action отвечает за адрес получателя отправляемых данных. В нашем случае форма отправляется на тот же адрес, т.е. на lessons/index.php.

Особое внимание заслуживает атрибут method , который определяет метод отправки запроса на сервер. Таких методов несколько, а наиболее распространенные (и практичные) это методы GET и POST. Сейчас нас будет интересовать метод GET.

GET-запрос означает, что данные будут передаваться на сервер непосредственно через адресную строку. Вы в этом уже убедились, отправив форму – к строке адреса добавились определенные данные. Откуда эти данные берутся? Обратите внимание на теги input в HTML-форме. У всех их присутствует атрибут name , который устанавливает имя данного поля.

При методе GET к основному адресу добавляется символ "?" (знак вопроса), чтобы сервер понимал, что поступили какие-то данные. После символа "?" идут непосредственно сами данные в виде имя=значение . Если таких данных несколько, то они разделяются между собой символом объединения "&". Отправьте форму с другими значениями полей и убедитесь в этом.

Пришло время научиться "ловить" и обрабатывать полученные данные. Ввиду того, что атрибут action указывает на текущий файл index.php, значит данные поступают именно сюда, поэтому в этом же файле мы и пропишем код обработки GET-запроса .

Итак, сразу же после тега добавим такой PHP-код:

Сохраните файл, снова зайдите на http://lessons/ , отправьте форму и – о, чудо! – что вы видите?

Только что, после отправки формы, сервер получил и обработал полученные данные и прислал в браузер свой ответ!

Рассмотрим PHP-код нашего проекта, который представляет собой условие:

If (isset($_GET["submit_form"])) { }

Сервер проверяет, а получена ли переменная GET-запроса с именем submit_form? То есть, говоря проще, а была ли вообще отправлена форма? Если это так, то серверный php-код отправляет прямо в браузер пользователя новую HTML-разметку со своим ответом, используя для этого оператор echo . Если вы внимательно изучите написанный код-обработчик, то вам сразу все станет понятным!

Интересный же этот метод GET! Измените адресную строку, например, на такую:

Http://lessons/index.php?user_name=Мое-имя&user_year=1900&submit_form=отправить

и нажмите кнопку "Ввод". Сервер снова вам ответит, приняв уже другие данные! Думаю, с этим все понятно.

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

Метод POST

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

Измените ваш файл, заменив в PHP-коде имена переменных $_GET на $_POST, а в форме пропишите method="POST" . Обновите страницу и снова отправьте форму. Результат будет таким же, что и при методе GET, однако адресная строка осталась без изменений, а это значит, что данные были благополучно отправлены в защищенном виде в теле самого запроса.

Для закрепления материала создадим маленькое веб-приложение, которое будет запрашивать логин и пароль пользователя для входа на сайт. Код примера будет относительно сложным и от вас требуется внимание и желание разобраться в функционале PHP-программы.

Файл index.php:

Запустите пример и посмотрите, что происходит. Вначале запрашивается логин и пароль пользователя (в коде мы определили их как "admin" и "secret"), если все верно – мы попадаем на главную страницу сайта, если данные неверные – выводится соответствующее предупреждение.

Рассмотрим реализацию данной технологии.

Обратите внимание – весь код HTML-формы мы не выводим непосредственно, а запоминаем в переменной $form.

Будьте внимательны с кавычками! Весь HMTL-код находится внутри одинарных кавычек, поэтому его внутренние кавычки должны быть двойными . Если бы вы написали

$form = " …ваш код… ",

то внутренний код будет содержать наоборот – одинарные кавычки.

Далее, в строке 27 проверяется, была ли отправлена форма (условие 1 на рис.), если нет – выводится HTML-форма, и сценарий прекращает свою работу – функция die() . Больше ничего, кроме формы в браузер не выводится.

Если данные были получены, то проверяются POST-переменные на соответствие заданным (условие 2 на рис.). Если они не совпадают, то выводится предупреждающее сообщение, HTML-форма для входа и сценарий снова прекращает работу (die() ).

Если же второе условие выполняется, то скрипт пропускает все операторы else и переходит на отображение основной страницы. (переход 3 на рис.).

Это простейший пример. Естественно, в реальных проектах таких прямых проверок не производится – логин и пароль в зашифрованном виде хранятся в файлах или базе данных. Поэтому в статье описана сама технология взаимодействия клиента и сервера на основе GET и POST запросов. Для создания полноценных приложений вам необходимо иметь твердые знания по базам данных и объектно-ориентированному программированию. Об этом – в следующих статьях.

HTML-формы позволяют передавать введенные пользователем данные на сервер, где их можно дополнительно обработать. Обслуживание форм выполняется в два этапа. Сначала форма должна быть представлена пользователю, который заполнит ее своими данными и затем отправит на сервер. У каждой формы есть целевая веб-страница, которая должна быть загружена для обработки данных, отправленных пользователем. Зачастую это тот же самый файл сценария, который генерирует форму. В этом случае PHP-код просто проверяет наличие данных в форме, чтобы определить, вызывать ли ему вновь сценарий для создания формы или начать обработку полученных данных.

Внимание! Урок устарел. Новые уроки по этой теме содержатся в курсе PHP для начинающих .

В большинстве случаев, отправка форм на сервер предполагает какую-то работу с базами данных. Например, операция поиска в базе данных – это необходимое действие для большинства разнообразных приложений, будь то поиск сообщений в форуме, пользователей или блога. В любом случае эта операция способна облегчить жизнь пользователя. Т.к. к данному моменту мы еще не познакомились с взаимодействием PHP и СУБД MySQL, то в данной статье мы рассмотрим простые примеры обработки форм, а главной задачей для меня является показать как происходит передача информации с помощью языка PHP.

Передача информации с помощью языка PHP

В данном разделе приведены основные сведения о том, как может осуществляться передача данных между веб-страницами. Определенная часть этой информации не относится исключительно к технологии PHP, а описывает взаимодействие средств PHP и HTML или касается самого протокола HTTP.

Отсутствие поддержки состояния в протоколе HTTP

Наиболее важная особенность функционирования любой технологии веб, о которой всегда следует помнить, состоит в том, что сам протокол HTTP характеризуется отсутствием поддержки состояний. Это означает, что каждый запрос HTTP (который в большинстве случаев сводится к требованию на получение и доставку отдельного ресурса, такого как HTML-страница, файл.jpg, таблица стилей и т.д.) является независимым от всех других запросов, не включает какую-либо информацию об идентификации клиента и не оставляет следа в памяти компьютера.

Даже если сайт спроектирован таким образом, что навигация, т.е. переход с одной страницы на другую, происходит строго в одном направлении (допустим, страница 1 ведет только к странице 2, которая ведет только к странице 3, и т.д.), средства поддержки протокола HTTP не имеют информации и не учитывают то, что пользователь, просматривающий страницу 2, обязательно должен был посетить перед этим страницу 1. Нельзя присвоить значение какой-либо переменной на странице 1 и надеяться на то, что оно будет импортировано на страницу 2 с помощью самого языка HTML. Код HTML может использоваться для отображения формы, и с помощью этого кода можно даже вводить информацию, но если не будут применяться некоторые дополнительные средства передачи введенной информации на другую страницу или в другую программу, то значение, присвоенное переменной, после перехода на другую страницу просто исчезнет.

Технологии обработки форм, подобные PHP, предназначены именно для решения этой задачи. Средства PHP позволяют перехватить значение переменной, передаваемое с предыдущей страницы на следующую, и обеспечить доступ к этому значению для дальнейшего использования. Как оказалось, технология PHP предоставляет возможность выполнять функции передачи данных такого типа чрезвычайно успешно, поэтому позволяет быстро и легко развертывать необходимые средства для решения самых разнообразных задач, связанных с обеспечением функционирования веб-сайта.

Удобные возможности по передаче небольшого количества значений с данной конкретной страницы на любую другую отдельную страницу веб-сайта предоставляют формы HTML. Есть и другие способы поддержки состояния на протяжении многих просмотров страниц, характеризующиеся большей продолжительностью хранения данных, такие как cookie-файлы и сеансы, которые будут описаны в одной из следующих статей. А в этой статье рассматриваются в основном наиболее простые способы передачи информации между веб-страницами, в которых используются методы GET и POST в сочетании с протоколом HTTP для создания динамически формируемых страниц и обработки данных формы.

Параметры GET

Метод GET предусматривает передачу параметров с предыдущей страницы на следующую в составе строки запроса, которая представлена в формате универсального идентификатора ресурса URI. При использовании метода GET для обработки формы к URL, обозначенному с помощью атрибута action формы, после разделителя добавляется в виде вопросительного знака указанное имя (имена) и значение (значения) переменной, после чего вся эта строка передается обрабатывающему агенту (в данном случае веб-серверу).

Ниже приведен пример формы HTML, в которой используется метод GET (введите эту разметку и сохраните файл под именем sportselect.html):

Основы PHP

Выберите ваш любимый вид спорта

После того как пользователь сделает свой выбор и щелкнет на кнопке "Отправить", браузер соединит перечисленные ниже элементы в указанном порядке, без пробелов между элементами:

  • URL в кавычках после слова action (http://localhost/sports.php).
  • Вопросительный знак (?), обозначающий, что следующие символы составляют строку GET.
  • Переменная name, знак равенства (=) и соответствующий параметр value (value=Хоккей).
  • Амперсанд (&) и следующая за ним пара name=value (если таковая имеется).

Таким образом, браузер сформирует следующую строку URL:
http://localhost/sports.php?sport=Хоккей

Затем браузер перенаправляет полученную строку URL в пределах собственного пространства адресов в качестве нового запроса. Сценарий PHP, приведенный ниже (sports.php), в который передается указанная форма, осуществляет выборку значений переменных GET из последней части строки запроса, вставляет эти переменные и значения переменных в суперглобальный массив $_GET (который будет вскоре описан) и выполняет какие-то необходимые действия с этими значениями; в данном случае происходит вставка в текстовую строку.

Ниже приведен пример кода, в котором показан обработчик формы PHP для указанной выше формы HTML:

Любимый вид спорта

Ваш любимый вид спорта -

Обратите внимание на то, что значение, введенное в поле формы HTML с атрибутом name="sport" на предыдущей странице, теперь доступно в виде переменной PHP с именем $_GET["sport"]. Работу этого примера демонстрирует следующий рисунок:

Теперь необходимо объяснить, как именно можно получить доступ к значениям, передаваемым со страницы на страницу. В этой статье рассматриваются два основных метода передачи значений используемых в формах - GET и POST. Каждый метод имеет связанный с ним суперглобальный массив. Суперглобальные массивы описаны более подробно в статье "Переменные и константы". Отличительной особенностью суперглобальных массивов от других массивов является наличие префикса в имени в виде знака подчеркивания.

Обработчик форм получает доступ к каждому элементу, передаваемому с помощью метода GET, обращаясь к массиву $_GET, а к каждому элементу, передаваемому с помощью метода POST, обращаясь к массиву $_POST. Синтаксическая структура, применяемая для обращения к какому-либо элементу суперглобального массива, является простой и полностью единообразной:

$_array_name["index_name"]

Здесь index_name - это часть пары "имя-значение", относящаяся к имени (для метода GET), или имя поля формы HTML (для метода POST). В соответствии с предыдущим примером $_GET["sport"] указывает значение элемента select формы, имеющего имя "sport"; это значение передано с помощью операции GET, выполненной применительно к первоначальному файлу. В обработчике формы необходимо использовать массив, соответствующий методу, с помощью которого были переданы данные. В частности, в рассматриваемом примере значение $_POST["sport"] не определено, поскольку из первоначальной формы не были отправлены какие-либо данные с помощью метода POST.

Метод GET обработки форм обладает одним значительным преимуществом над методом POST - он фактически позволяет каждый раз формировать новую и соответствующую текущей ситуации строку запроса URL. После этого пользователи могут устанавливать закладку на данную страницу. С другой стороны, результаты передачи форм с помощью метода POST не могут быть отмечены закладками.

Только то, что желаемые функциональные возможности могут быть достигнуты с помощью параметров GET, не означает, что обязательно нужно использовать метод GET. Недостатки метода GET, которые обнаруживаются в большинстве типов обработки форм, являются столь существенными. В оригинальной рабочей спецификации HTML 4.0, опубликованной в 1997 году, этот метод не был рекомендован к использованию. Основные недостатки метода GET перечислены ниже:

  • Метод GET не применим для создания окон регистрации, поскольку имя пользователя и пароль полностью видны на экране, а также не исключена возможность сохранения этих данных в памяти браузера клиента в качестве информации о посещенной странице.
  • Каждая операция передачи данных по методу GET, включая сам набор данных, регистрируется в журнале веб-сервера.
  • В методе GET предусмотрено присваивание данных переменной среды сервера, поэтому длина URL ограничена. Возможно, вам доводилось видеть, как выглядят очень длинные URL, переданные с помощью метода GET, и действительно, вряд ли кому-то захочется передавать с помощью этого метода фрагмент текста в формате HTML, состоящего из 300 слов.

В первоначальной спецификации HTML указано, что длина строки запроса не должна превышать 255 символов. Безусловно, это ограничение в дальнейшем было снято и осталась лишь рекомендация придерживаться предела в 255 символов, но применение более длинных строк все равно может стать причиной нарушения в работе.

Параметры POST

В настоящее время предпочтительным методом отправки данных формы является POST (особенно при случаях, в которых осуществление действий приводит к постоянным изменениям, таких как ввод информации в базу данных). Набор данных формы включается в тело формы при перенаправлении формы к обрабатывающему агенту (в данном случае к интерпретатору PHP). Строка URL не претерпевает каких-либо видимых изменений, отражающих разнообразие передаваемых данных.

Среди разработчиков распространена ничем не оправданная уверенность в том, что метод POST более безопасен, чем GET. В действительности ни один из этих методов не является более или менее безопасным, чем другой. Посетитель может столь же успешно просматривать переменные и данные, отправляемые с помощью метода POST, как и с помощью метода GET. Единственное различие состоит в том, что в первом случае передаваемые данные не обнаруживаются в адресной строке. Но это не означает, что они скрыты. Данные, отправленные с помощью метода POST, могут просматриваться и модифицироваться пользователем веб-сайта.

Первым и наиболее важным правилом программирования, особенно программирования для сети, является следующее:
Никогда не доверять входным данным.

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

Данные передаваемой формы становятся в большей или меньшей степени безопасными, только если запрос защищен с использованием SSL, TLS или какого-то другого способа шифрования. Но к конечному пользователю или посетителю данные все равно поступают в открытом виде, поэтому для него так или иначе остается возможность просматривать и изменять данные. Дело в том, что с помощью протокола SSL осуществляется просто шифрование данных, передаваемых по сети, что не позволяет рассматривать данные в открытом виде на этапе их прохождения от отправителя к получателю. Что же касается возможности для посетителя вносить изменения в данные формы, то в протоколе SSL для предотвращения этого ничего не предусмотрено.

Чтобы изменить способ передачи данных в предыдущем примере, нужно внести следующие изменения:

...

Работа с несколькими значениями

Если в форме есть флажки или переключатели, возникает новая проблема. Например, пользователь может выбрать в форме сразу два значения, но переменная не может хранить больше одного значения, поэтому придется использовать массив. Эта ситуация демонстрируется в примере ниже:

" method="post">
Выберите ваших любимых питомцев

Выбраны животные: "; foreach ($animal as $a) { echo "".htmlentities($a)." "; } } ?>

Эта форма позволяет пользователю выбрать любимых питомцев. В данном примере пользователь может пометить сразу несколько флажков. Значит, при обработке данных формы в PHP-сценарии необходимо предусмотреть возможность получить доступ к нескольким значениям по одному имени. Мы поместили пару квадратных скобок () после имени в атрибуте name, чтобы иметь возможность отправлять несколько вариантов выбора в виде массива. Если бы квадратные скобки были опущены, и пользователь пометил бы несколько флажков, его выбор был бы замещен последним отмеченным флажком. Поместив квадратные скобки после имени, мы указали, что значения должны храниться в виде массива.

В обработчике массив сохраняется в переменную $animal и перечисляется с помощью цикла foreach, как обычный массив.

Валидация формы и форматирование переменных формы

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

Более удобной для пользователей является проверка на стороне клиента с использованием JavaScript, но вне зависимости от того будет ли данная проверка использована, проверку на стороне сервера нужно выполнять обязательно.

При создании форм HTML необходимо также учитывать следующее: если в форме должны быть отображены заранее заполненные входные данные, то необходимо установить атрибут value. Это замечание особенно справедливо по отношению к двум разновидностям форм - тем, которые используются для редактирования данных, полученных из базы данных, и тем, которые предназначены для возможной отправки данных больше одного раза. Последний случай очень часто встречается в таких ситуациях, когда форма должна быть повторно выведена после обнаружения ошибок в уже заранее, заполненных данных. В качестве примера можно указать форму регистрации, данные которой не принимаются на обработку до тех пор, пока пользователь не укажет допустимый адрес электронной почты или другие необходимые данные.

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

Основы PHP

" method="post">
Контактная информация " class="">
" class="">

В этом примере используется функция filter_var() которая осуществляет проверку переменной с использованием фильтра и принимает два параметра - исходную строку и константу, указывающую на тип фильтра. Кроме валидации email-адресов (FILTER_VALIDATE_EMAIL) эта функция поддерживает следующие константы: FILTER_VALIDATE_URL - проверяет значение на корректность URL (например,), FILTER_VALIDATE_IP - проверяет значение на корректность IP-адресов, FILTER_VALIDATE_REGEXP - проверяет значение на корректность синтаксису регулярного выражения и несколько других констант, являющихся альтернативами функций is_bool(), is_float(), is_int() и т.п.

доступ к таким данным осуществлялся по именам переданных переменных (напомним, что данные передаются в виде пар " имя переменной , символ "=", значение переменной"). Таким образом, если, например, было передано first_name=Nina , то внутри скрипта появлялась переменная $first_name со значением Nina . Если требовалось различать, каким методом были переданы данные, то использовались ассоциативные массивы $HTTP_POST_VARS и $HTTP_GET_VARS , ключами которых являлись имена переданных переменных, а значениями – соответственно значения этих переменных. Таким образом, если пара first_name = Nina передана методом GET , то $ HTTP_GET_VARS ["first_name"]="Nina" .

Использовать в программе имена переданных переменных напрямую небезопасно. Поэтому было решено начиная с PHP 4.1.0 задействовать для обращения к переменным, переданным с помощью HTTP-запросов, специальный массив – $_REQUEST . Этот массив содержит данные, переданные методами POST и GET , а также с помощью HTTP cookies. Это суперглобальный ассоциативный массив , т.е. его значения можно получить в любом месте программы, используя в качестве ключа имя соответствующей переменной (элемента формы).

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

Тогда, если в форму мы ввели имя "Вася", фамилию "Петров" и выбрали среди всех курсов курс по PHP , на экране браузера получим такое сообщение:

После введения массива $_REQUEST массивы $HTTP_POST_VARS и $HTTP_GET_VARS для однородности были переименованы в $_POST и $_GET соответственно, но сами они из обихода не исчезли из соображений совместимости с предыдущими версиями PHP . В отличие от своих предшественников, массивы $_POST и $_GET стали суперглобальными, т.е. доступными напрямую и внутри функций и методов.

Приведем пример использования этих массивов. Допустим, нам нужно обработать форму, содержащую элементы ввода с именами first_name , last_name , kurs (например, форму form.html , приведенную выше). Данные были переданы методом POST , и данные, переданные другими методами, мы обрабатывать не хотим. Это можно сделать следующим образом:

Тогда на экране браузера, если мы ввели имя "Вася", фамилию "Петров" и выбрали среди всех курсов курс по PHP , увидим сообщение, как в предыдущем примере:

Для того, чтобы сохранить возможность обработки скриптов более ранних версий, чем PHP 4.1.0, была введена директива register_globals , разрешающая или запрещающая доступ к переменным непосредственно по их именам. Если в файле настроек PHP параметр register_globals =On , то к переменным, переданным серверу методами GET и POST , можно обращаться просто по их именам (т.е. можно писать $first_name ). Если же register_globals =Off , то нужно писать $ _REQUEST ["first_name"] или $ _POST ["first_name"] , $ _GET ["first_name"] , $ HTTP_POST_VARS ["first_name"] , $ HTTP_GET_VARS ["first_name"] . С точки зрения безопасности эту директиву лучше отключать (т.е. register_globals =Off ). При включенной директиве register_globals перечисленные выше массивы также будут содержать данные, переданные клиентом .

Иногда возникает необходимость узнать значение какой-либо переменной окружения , например метод, использовавшийся при передаче запроса или IP- адрес компьютера, отправившего запрос . Получить такую информацию можно с помощью функции getenv() . Она возвращает значение переменной окружения , имя которой передано ей в качестве параметра.

Пример 4.3. Использование функции getenv()

Как мы уже говорили, если используется метод GET , то данные передаются добавлением строки запроса в виде пар "имя_переменной= значение к URL -адресу ресурса". Все, что записано в URL после знака вопроса, можно получить с помощью команды

getenv("QUERY_STRING");

Благодаря этому можно по методу GET передавать данные в каком-нибудь другом виде. Например, указывать только значения нескольких параметров через знак плюс, а в скрипте разбирать строку запроса на части или можно передавать значение всего одного параметра. В этом случае в массиве $_GET появится пустой элемент с ключом, равным этому значению (всей строке запроса ), причем символ " + ", встретившийся в строке запроса , будет заменен на подчеркивание " _ ".

Методом POST данные передаются только с помощью форм, и пользователь (клиент ) не видит, какие именно данные отправляются серверу . Чтобы их увидеть, хакер должен подменить нашу форму своей. Тогда сервер отправит результаты обработки неправильной формы не туда, куда нужно. Чтобы этого избежать, можно проверять адрес страницы, с которой были посланы данные. Это можно сделать опять же с помощью функции getenv() :

getenv("HTTP_REFERER");

Теперь самое время решить задачу, сформулированную в начале лекции.

Пример обработки запроса с помощью PHP

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

Форма для регистрации студентов

Имя

Фамилия

E-mail

Выберите курс, который вы бы хотели посещать:
PHP
Lisp
Perl
Unix

Что вы хотите, чтобы мы знали о вас?

Листинг 4.4. form_final.html

Здесь все достаточно просто и понятно. Единственное, что можно отметить, – это способ передачи значений элемента checkbox . Когда мы пишем в имени элемента kurs , это значит, что первый отмеченный элемент checkbox будет записан в первый элемент массива kurs , второй отмеченный checkbox – во второй элемент массива и т.д. Можно, конечно, просто дать разные имена элементам checkbox , но это усложнит обработку данных, если курсов будет много.

Скрипт, который все это будет разбирать и обрабатывать, называется 1.php (форма ссылается именно на этот файл, что записано в ее атрибуте action ). По умолчанию используется для передачи метод GET , но мы указали POST . По полученным сведениям от зарегистрировавшегося человека, скрипт генерирует соответствующее сообщение. Если человек выбрал какие-то курсы, то ему выводится сообщение о времени их проведения и о лекторах, которые их читают. Если человек ничего не выбрал, то выводится сообщение о следующем собрании заочной школы программистов (ЗШП).

"14.30","Lisp"=>"12.00", "Perl"=>"15.00","Unix"=>"14.00"); $lectors = array("PHP"=>"Василий Васильевич", "Lisp"=>"Иван Иванович", "Perl"=>"Петр Петрович", "Unix"=>"Семен Семенович"); define("SIGN","С уважением, администрация"); // определяем подпись письма как константу define("MEETING_TIME","18.00"); // задаем время собрания студентов $date = "12 мая"; // задаем дату проведения лекций //начинаем составлять текст сообщения $str = "Здравствуйте, уважаемый " . $_POST["first_name"] . " " . $_POST["last_name"]."!
"; $str .= "
Сообщаем Вам, что "; $kurses = $_POST["kurs"]; // сохраним в этой переменной // список выбранных курсов if (!isset($kurses)) { // если не выбран ни один курс $event = "следующее собрание студентов"; $str .= "$event состоится $date ". MEETING_TIME . "
"; } else { // если хотя бы один курс выбран $event = "выбранные Вами лекции состоятся $date

    "; //функция count вычисляет число элементов в массиве $lect = ""; for ($i=0;$iлекция по $k в $times[$k]"; // составляем сообщение $lect .= " (Ваш лектор, $lectors[$k])"; } $event = $event . $lect . "
"; $str .= "$event"; } $str .= "
". SIGN; // добавляем подпись echo $str; // выводим сообщение на экран?> Листинг 4.5. Скрипт 1.php, обрабатывающий форму form_final.html

Заключение

Подведем итоги. Мы научились отличать клиента от сервера и компьютер - сервер от программы- сервера , познакомились с основными методами, используемыми для передачи данных на сервер , изучили средства, предлагаемые языком PHP для обработки клиентских запросов, и испробовали их на практике. В принципе этого достаточно для того, чтобы создавать клиент-серверные приложения.

Новое на сайте

>

Самое популярное