Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web - tec / PHP 5 для начинающи

.pdf
Скачиваний:
69
Добавлен:
12.06.2015
Размер:
26.79 Mб
Скачать

PHP, HTML и состояние сеанса 103

Указанный код создает простую форму с двумя полями (имя пользователя и па+ роль) и кнопкой отправки данных. При нажатии этой кнопки содержимое формы от+ правляется серверу www.example.com.

Каким образом можно заставить HTML+формы и PHP работать сообща для созда+ ния динамически генерируемых Web+страниц (а не просто копировать страницы в браузер с Web+сервера)? Прежде всего, с помощью HTML+тегов в виде простого тек+ ста необходимо создать Web+страницу и включить в нее HTML+форму. Затем в данную страницу следует ввести PHP+код и убедиться, что он соответствующим образом огра+ ничен разделителями <?php и ?>.

Когда браузер запрашивает Web+страницу, любой PHP+код в ней преобразовывает+ ся или обрабатывается PHP+интерпретатором, прежде чем результаты будут возвраще+ ны пользователю, а результаты PHP+обработки подставляются в те места Web+страницы, где был расположен исходный PHP+код. Можно также написать код, который будет об+ рабатываться, только если на форме нажата кнопка отправки данных (как написать такой код, показано в нескольких последующих разделах). Этот код может даже ис+ пользовать в своей работе некоторые из переданных посредством формы данных.

Окончательный результат PHP+обработки является HTML+кодом, но поскольку PHP+ интерпретатор перед отправкой окончательной версии Web+страницы имеет возмож+ ность выполнить какую+либо обработку, некоторое содержимое страницы (любые фрагменты, сгенерированные PHP+кодом) может отличаться при каждом новом запросе этой страницы. А если обработка выполняется в ответ на передачу данных формы, то появляется возможность создавать множество различных интерактивных функций.

Доступ к PHP- и HTTP-данным

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

Каждый раз, когда пользователь нажимает на ссылку или кнопку отправки в фор+ ме, браузер отправляет Web+серверу множество информации о самом себе и операци+ онной системе на компьютере пользователя. Аналогично во время ответа Web+сервер отправляет множество данных о самом себе. В PHP имеются возможности получения данных, которые передаются браузером, а также способы открытия данных о PHP+ инсталляции на сервере. Например, когда пользователь направляется на какой+либо Web+сайт на основе PHP и регистрируется на нем, вероятнее всего, на сервере запол+ няется предопределенная переменная $_POST (в нее, в частности, попадает имя пользователя и пароль), а также предопределенная переменная $_SERVER, в которой содержится информация о текущей серверной среде. Обе эти переменные доступны PHP+приложению, работающему на сайте. Эти аспекты PHP более подробно обсужда+ ются в нескольких последующих разделах. Количество доступных данных действитель+ но удивительно (особенно учитывая то, что большинство начинающих разработчиков даже не подозревают о них). Далее описано, как получить доступ к этим данным.

104 Глава 3

Предопределенные переменные

PHP автоматически создает довольно много переменных (которые называются предопределенными переменными), доступных в любой точке программы. Эти переменные являются массивами, и доступ к ним может осуществляться по имени, как и к любым дру+ гим переменным. По умолчанию PHP сконфигурирован так, чтобы не передавать непо+ средственно эти переменные в сценарии (в файле php.ini register_globals=Off). Чтобы получить доступ к хранящимся в них данным, необходимо использовать их полные имена. Например, если в форме имеется текстовое поле с именем username и это поле заполнено и форма отправлена (в данном случае предполагается, что метод от+ правки POST), то получить доступ к данным поля можно с помощью следующего кода:

$my_new_username = $_POST[username];

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

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

Простейший способ определить, какую информацию предоставляет функция phpinfo(), заключается в запуске файла test01.php, созданного в главе 1. Однако в данном случае это делается не только для того, чтобы проверить работоспособность инсталляции PHP (как это было в главе 1), но и чтобы получить возможность изучить различные данные, предоставляемые функцией phpinfo(). В ходе выполнения функция создает хорошо отформатированную и детально проработанную страницу (включая все необходимые HTML+теги), на которой представлена информация о вер+ сии PHP, операционной системе, версии Zend Engine, установках в php.ini, допол+ нительных модулях и предопределенных переменных. Фрагмент страницы, созда+ ваемой функцией phpinfo(), показан на рис. 3.1.

Переменные в HTTP-запросах и ответах

Между клиентом и Web+сервером передается очень много данных. Например, вме+ сте с каждым запросом от клиента к серверу передается IP+адрес (для того чтобы сер+ вер знал, куда отправлять ответ). Кроме IP+адреса также передаются подробные све+ дения о версии браузера, инициирующего данный запрос, cookie+файлы, данные форм, версия Web+сервера и другая информация. Эти данные содержатся в предопре+ деленных переменных, структурированных в виде ассоциативных массивов, поэтому доступ к ним можно осуществлять по имени, как и в случае любых других массивов. Содержимое каждой из этих переменных и их назначение представлено после сле+ дующего раздела ‘‘Практика’’.

PHP, HTML и состояние сеанса 105

Рис. 3.1.

В конфигурационном файле PHP (php.ini) имеется директива register_globals. По умолчанию она имеет значение off (начиная с PHP 4.2) и ограничивает доступ к некоторым предопределенным переменным. С практической точки зрения это означает, что для доступа к данным предопределенных переменных необходимо использовать полное имя соответствующего массива (например, так: $_SERVER['DOCUMENT_ROOT']). Существует функция (import_request_variables()), которая импортирует переменные GET, POST и Cookie в глобальную область видимости, по+ этому к ним можно получить доступ непосредственно по имени, однако рекомендует+ ся все+таки использовать полное имя массива, поэтому в данной книге используется именно такой синтаксис.

Практика Отображение массива $GLOBALS

Следующий код распечатывает содержимое предопределенной переменной $GLOBALS. Данный код можно вставить в отформатированную HTML+страницу.

<?php

echo "<pre>"; print_r($GLOBALS); echo "</pre>";

?>

106 Глава 3

Если вызвать данный код в браузере (назовем этот файл displaying_predefined_ vars.php), то можно посмотреть содержимое массива $GLOBALS. Может так слу+ читься, что все элементы массива в данный момент окажутся пустыми. В конце этого раздела помещен рисунок, показывающий, как выглядит содержимое предопределен+ ных переменных.

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

Как это работает

Функция print_r() распечатывает информацию о переменных в удобочитаемом для пользователя формате. Особенно полезна данная функция для вывода содержи+ мого массивов, так как она распечатывает по порядку ключи и значения. Рекоменду+ ется использовать ее с HTML+тегами <pre>, так чтобы данные располагались на стра+ нице не в одну строку, а по одному элементу в строке.

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

В приведенной ниже таблице описаны предопределенные массивы. Они называются суперглобальными, потому что к ним можно получить доступ из любой точки PHP+ программы, не используя ключевое слово global и независимо от области видимости.

Массив

Описание

$GLOBALS Содержит ссылку на каждую переменную, имеющую глобальную область видимости в PHP-программе. Многие переменные в $GLOBALS также являются другими суперглобальными массивами

$_SERVER В данном массиве содержатся все данные, отправляемые сервером в HTTPответе, например, имя выполняемого в текущий момент сценария, имя сервера, версия HTTP, удаленный IP-адрес и т.д. Несмотря на то что большинство Web-серверов создают одинаковые серверные переменные, делают это не все серверы, и не все серверные переменные обязательно содержат данные

$_GET Содержит все переменные строки запроса, которые были прикреплены к URL

или были созданы в результате использования метода GET

$_POST Содержит все переданные переменные формы и их данные. Массивы $_POST или $_REQUEST широко используются в большинстве PHP-программ. Например, чтобы получить имя или пароль (или любую другую пользовательскую информацию), переданные как часть HTML-формы, применяются PHP-переменные из массива $_REQUEST

$_COOKIE Содержит все cookie-файлы, отправленные браузером серверу. Они преобразуются в переменные, которые можно считывать из данного массива. Записывать cookieфайлывпользовательскийбраузерможноспомощьюфункцииsetcookie(). Cookieфайлы обеспечивают средство идентификации пользователя между запросами страниц (или между посещениями сайта, в зависимости от срока действия cookie-файла) и часто используются автоматически при обработке сеансов

$_FILES Содержит любые объекты, загруженные на сервер с использованием метода POST. Данный массив отличается от массива $_POST тем, что он специально предназначен для хранения загружаемых объектов (например, графических файлов), а не содержимого полей переданной HTML-формы

PHP, HTML и состояние сеанса 107

Окончание таблицы

Массив

Описание

$_ENV Содержит данные о среде, в которой работает Web-сервер и PHP, например, имя компьютера, версию операционной системы и т.д.

$_REQUEST Содержит все данные массивов $_GET, $_POST и $COOKIE

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

Следующий код генерирует страницу, демонстрирующую содержимое описанных выше суперглобальных переменных. При внимательном изучении кода становится очевидным, что в нем много повторяющихся фрагментов; это связано с тем, что ото+ бражаются все переменные (наряду с множеством HTML+кода для форматирования). Прежде чем вызывать данный код в браузере, его следует сохранить в файле с именем displaying_predefined_vars.php.

<html>

<head>

<title>Предопределенные переменные</title>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head>

<body bgcolor="#FFFFFF"> <table width="100%" border="1">

<tr><td colspan="2"><font face="Arial, Helvetica, sans-serif" size= "-1"><b>Отображение предопределенных переменных</b></font></td> </tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Глобальные - $GLOBALS</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-2"> <?php

echo "<pre>"; print_r($GLOBALS); echo "</pre>";

?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Серверные - $_SERVER</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_SERVER); echo "</pre>";

?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Массив $_GET </font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_GET); echo "</pre>"; ?> </font></td>

</tr>

108 Глава 3

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Массив $_POST </font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_POST); echo "</pre>"; ?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Cookie - $_COOKIE</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_COOKIE); echo "</pre>";

?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Файлы - $_FILES</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_FILES); echo "</pre>"; ?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Среда - $_ENV</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_ENV); echo "</pre>"; ?> </font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Запрос - $_REQUEST</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_REQUEST); echo "</pre>";

?>

</font></td>

</tr>

<tr><td width="40%" valign="top"><font face="Arial, Helvetica, sans-serif" size="-1">Сеанс - $_SESSION</font></td>

<td width="60%"><font face="Arial, Helvetica, sans-serif" size="-1"> <?php

echo "<pre>"; print_r($_SESSION); echo "</pre>";

?>

</font></td>

</tr>

</table>

</body>

</html>

PHP, HTML и состояние сеанса 109

Результат работы данной страницы показан на рис. 3.2.

Рис. 3.2.

Гиперссылки

Читатели, которые занимались Web+дизайном или программированием, несо+ мненно, знакомы со структурой ссылок в HTML. В технических терминах в HTML+ ссылке используется указательный элемент (имеющий начальный и конечный теги, соответственно, <a> и </a>) и один из главных атрибутов href, значением которого является URL+адрес. Текст или изображение, помещенное между начальным и конеч+ ным тегами <a>, образует ссылку, при нажатии на которую в браузере отображается страница, имеющая URL, равный значению атрибута href, см. пример ниже.

<a href="http://www.myplace.com">Нажмите здесь</a>

Нажатие на ссылки является одной из форм взаимодействия пользователя с Web+ приложением и позволяет обмениваться данными с сервером. Однако это взаимодей+

110 Глава 3

ствие весьма ограничено, поскольку все, что пользователь может сделать ++++++ иниции+ ровать запрос на страницу, которая уже подготовлена разработчиком Web+сайта. На+ пример, при нажатии на ссылку ‘‘О нас’’ единственная причина, по которой отобра+ жается необходимая страница, заключается в том, что разработчик сайта уже жестко вписал код ссылки с URL данной страницы.

Строки запросов

Сравнительно гибкой является строка запроса (query string), которая присоединяется в конец URL ссылки. Строка запроса может состоять из множества пар имя/значение. Количество таких пар определяется разработчиком. Серьезное отличие строки за+ проса от обычной ссылки заключается в том, что PHP предоставляет способ, позво+ ляющий пользователю задавать значения, которые могут быть вставлены в строку за+ проса. Предположим, например, что пользователь ввел значение John в качестве имени, тогда PHP+программа может использовать это значение посредством пере+ менной, например, $first_name.

Термин “пара имя/значение” является распространенным способом обозначения любого именованного контейнера для значения. Парами имя/значение могут быть поля в таблице базы данных, переменные, HTML- и XML-атрибуты и т.д.

Используя следующий код, можно написать PHP+программу, которая генерирует строку запроса, присоединяемую к URL (предполагается, что переменные $first_name и $last_name уже заданы):

<a href="http://www.myplace.com?first_name=<?php echo $first_name; ?>">Нажмите здесь</a>

Данный код генерирует следующий вывод:

<a href="http://www.myplace.com?first_name=John">Нажмите здесь</a>

Строка запроса состоит из знака вопроса, за которым следует имя первой пары имя/значение, знак равенства и значение первой пары имя/значение. Если установ+ лены обе переменные ($first_name и $last_name), то в строку запроса можно включить обе пары имя/значение, соединив их амперсандом (&), например:

<a href="http://www.myplace.com?first_name=<?php echo $first_name; ?> &last_name=<?php echo $last_name; ?>">Нажмите здесь</a>

Такой код будет генерировать следующий результат:

<a href="http://www.myplace.com?first_name=John&last_name=Wayne">Нажмите здесь</a>

Строки запроса весьма полезны (особенно для сохранения значений между запро+ сами страницы; эта тема обсуждается в настоящей главе позднее), но, очевидно, они все+таки тоже довольно ограничены. Чтобы поместить в строку запроса предостав+ ленное пользователем значение, необходимо иметь это значение. Значение можно было бы получать из базы данных. Однако если это значение перед использованием необходимо получить от пользователя, то следует предоставить пользователю какой+ нибудь простой метод ввода. И здесь на помощь приходит очень мощный метод взаи+ модействия между пользователем и приложением ++++++ HTML+форма.

PHP, HTML и состояние сеанса 111

HTML-формы (или Web-формы)

Как уже отмечалось, существует два основных метода взаимодействия пользователя с Internet+приложением в браузере: нажатие на ссылку или отправка формы. Нажатие на ссылку приводит к тому, что Web+серверу отправляется запрос на определенную стра+ ницу, а если разработчик приложения включил в строку запроса какие+либо данные, то эти данные также будут отправлены. Однако HTML+форма предоставляет более широ+ кие возможности отправлять данные Web+серверу. Хотя некоторые из полей формы мо+ гут быть предустановленными (например, данные в строке запроса), другие поля (например, поля типа text и textarea) дают возможность контролировать передавае+ мые данные. Таким образом, HTML+формы широко используются для создания интерак+ тивных возможностей, которые подобны интерактивности настольных приложений.

Дескрипторы HTML-форм

В HTML+спецификации описаны HTML+дескрипторы форм, включая дескриптор <form> (начинающий и завершающий форму), <input> (создающий несколько типов полей, в частности, текстовые поля, переключатели, кнопки и др.), <textarea> (создающий текстовое поле с возможностью ввода нескольких строк), а также деск+ риптор <select> (который создает выпадающие и статические списки значений).

У каждого из этих дескрипторов имеются атрибуты. Например, в дескриптор <form> включается атрибут method. Значение данного атрибута может устанавливаться в начальном теге <form> и может быть словом post (например, method="POST"); в та+ ком случае при отправке формы будет использоваться HTTP+метод POST.

Несмотря на то что HTML-дескрипторы часто называют тегами, термин “тег” обозначает только начальный или конечный HTML-разделитель. Например, <p> — начальный тег HTML-дескриптора P (создание абзаца), а </p> — его конечный тег. Вместе теги <p> и </p> образуют дескриптор P. Текст между ними

(текст, который отображается в браузере как абзац) называется содержимым дескриптора.

При условии правильного написания дескрипторов HTML+форм их комбинация соз+ дает весьма мощное средство взаимодействия пользователя с Web+приложением. В после+ дующих разделах подробно обсуждаются дескрипторы полей формы и их атрибуты.

Дескриптор <form>

Как работает HTML+форма? Пользователь заполняет различные текстовые поля и, когда все данные внесены, нажимает на кнопку Отправить (Submit); затем введенная

им информация упаковывается одним из двух способов и отправляется Web+серверу. После этого Web+сервер может извлечь информацию и передать ее PHP+машине. PHP обрабатывает информацию и возвращает ее браузеру как часть HTTP+ответа. Чтобы создать форму, единственное, что нужно сделать ++++++ написать HTML+страницу с от+ крывающим и закрывающим тегами <form>. Любые элементы управления, которые размещаются между тегами <form>, автоматически становятся частью формы, от+ правляемой Web+серверу. Например:

<form name="myform" action="myform_processor.php" method="POST">

<input type="text" name="first_name">

<input type="submit" name="button" value="Отправить ответ"> </form>

112Глава 3

Вданном случае форма получает имя myform. Когда пользователь нажимает кноп+ ку Отправить ответ, запрос (методом POST) и все введенные пользователем данные

отправляются для обработки PHP+файлу myform_processor.php. Естественно, дан+ ный запрос можно отправить любой странице или файлу; его даже можно отправить текущей странице, но при этом необходимо помнить, что запрашиваемая страница должна иметь код для приема отправленных формой данных и их обработки.

Первый дескриптор <input> имеет атрибут type, определяющий тип отображае+ мого поля формы, в данном случае это текстовое поле. Хотя в приведенном примере имя формы (myform) не имеет особого значения, имя первого дескриптора <input> крайне важно, так как PHP автоматически создает переменную $first_name и при+ сваивает ей значение, равное тексту, введенному пользователем в данное поле. Эта переменная будет частью массива $_GET или $_POST в зависимости от установленно+ го для формы метода отправки.

Второй дескриптор <input> имеет тип submit, поэтому он отображает кнопку отправки данных. Значением атрибута value является строка Отправить ответ, по+ этому на кнопке появляется надпись ‘‘Отправить ответ’’. В данном случае ни имя, ни значение не являются особенно важными (поскольку рассматривается только прин+ цип PHP+обработки), однако следует учитывать, что как только форма передается серверу, имя и значение становятся доступными для обработки в PHP+программе.

В тот момент, когда пользователь заполняет форму и отправляет ее, имена и значе+ ния полей формы становятся переменными, доступными для принимающей PHP+ программы (она указывается в атрибуте action дескриптора <form>). Таким образом, весь диапазон взаимодействия пользователя с HTML+формами становится очевидным.

Обратите внимание на несколько важных моментов, касающихся HTML+форм.

На одной Web+странице может быть несколько форм, каждая из которых (в том числе и ее поля) может отправляться независимо от других.

Обычно имена форм не важны, если не используются JavaScript+сценарии, оп+ ределяющие, какую форму обрабатывать или отправлять.

Значения, передаваемые в форме, всегда являются строками; как только они попадают в PHP+программу, их можно преобразовать в любой тип данных.

Не все имена полей и значения становятся доступными в PHP+програме при отправке формы. Например, передается значение только выбранного пере+ ключателя (в группе переключателей).

Атрибуты дескриптора <form>

Дескриптор <form> имеет множество атрибутов, однако особое внимание следует уделить только двум из них: action и method. Другие атрибуты, такие как id, class, dir, lang, language, name, style и title, универсальны для большинства или всех HTML+тегов и не требуют дальнейших пояснений. Более сложные атрибуты acceptchar и enctype, которые определяют набор символов и MIME+тип данных формы, выходят за рамки главы (атрибут enctype более подробно рассматривается в главе 7). Атрибут target работает аналогично одноименному атрибуту дескриптора <a>: он позволяет указывать фрейм или окно, в котором следует отображать Web+страницу, отосланную в ответ на отправку данной формы.

Соседние файлы в папке web - tec