Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад] [Содержание] [Дальше]

Практика применения Perl, PHP, Apache, MySQL для активных Web-сайтов

(С) Александр Фролов, Григорий Фролов, 2002

10. Применение сценариев PHP

10. Применение сценариев PHP.. 1

Как работают сценарии PHP. 4

Установка интерпретатора PHP. 4

Установка в среде Linux. 5

Изменение параметров установки. 5

Проверка установки в среде Linux. 5

Установка в среде Microsoft Windows. 6

Настройка Apache для работы с PHP. 7

Настройка Microsoft IIS для работы с PHP. 7

Проверка установки в среде Microsoft Windows. 10

Просмотр переменных окружения.. 10

Обработка форм... 12

Способы получения содержимого полей формы.. 12

Использование массива $HTTP_POST_VARS[].. 12

Использование глобальных переменных. 13

Сценарий для обработки формы.. 13

Однострочное текстовое поле. 14

Многострочное текстовое поле. 15

Флажки с независимой фиксацией. 15

Флажки с зависимой фиксацией. 16

Обработка списка. 17

Обработка данных от графической кнопки. 17

Программа AREFPHP. 18

Работа с Cookie в сценариях PHP. 19

Заголовок HTTP для создания Cookie. 19

Запись Cookie. 20

Получение значения Cookie. 20

Изменение значения параметра Cookie. 21

Удаление Cookie. 21

Пример использования Cookie. 21

Определение текущего цвета фона. 23

Установка нового цвета фона. 23

Установка цвета фона по умолчанию.. 24

Обмен данными с сервером электронной почты... 24

Настройка интерпретатора PHP для работы с электронной почтой. 24

Настройка для Linux. 25

Настройка для Microsoft Windows. 25

Отправка почты с помощью функции mail 25

Шаблоны HTML в сценариях PHP. 27

Состав дистрибутива класса Template. 28

Три типа шаблонов. 29

Простые шаблоны.. 29

Циклические шаблоны.. 29

Условные шаблоны.. 29

Пример использования простого шаблона. 30

Исходный текст файла шаблонов. 30

Сценарий PHP для заполнения шаблона. 31

Пример использования циклического шаблона. 33

Исходный текст файла шаблонов. 33

Сценарий PHP для заполнения шаблона. 34

 

В предыдущих разделах нашей книги мы рассказывали о технологии создания Web-приложений, основанной на использовании программ CGI, составленных на языке Perl. Эта технология, насчитывающая многолетнюю историю, позволяет создавать Web-приложения, легко переносимые на различные компьютерные платформы Linux и Unix-подобные операционные системы, Mac OS, а также Microsoft Windows.

Другая популярная технология создания переносимых Web-приложений предполагает применение так называемых серверных сценариев PHP. Аббревиатура PHP расшифровывается рекурсивно как PHP Hypertext Preprocessor, что означает «препроцессор гипертекста PHP».

Рекурсивное определение терминов

Рекурсивное определение термина PHP характерно для разработчиков программного обеспечения Unix-подобных операционных систем. В качестве примера другого рекурсивного определения можно привести название проекта GNU, в рамках которого ведется разработка программ с открытым исходным текстом. Название GNU расшифровывается как GNU is Not Unix, то есть «GNU — это не Unix».

Заметим, что для аббревиатуры PHP существует и другая расшифровка — персональные домашние странички (Personal Home Page, PHP). Чтобы понять, откуда взялось это название, нужно познакомится с историей создания PHP.

Препроцессор PHP был создан в 1994 году программистом по имени Rasmus Lerdorf. Первоначальная цель, которая преследовалась при разработке, была очень проста — прослеживание посетителей домашней Web-странички, содержащей резюме программиста. Через год PHP стал доступен разработчикам Web-приложений под названием Personal Home Page Tools, что можно перевести как «инструментарий для создания персональных домашних страничек».

Первые версии PHP содержали довольно простой интерпретатор серверных сценариев, облегчавший создание таких непременных атрибутов домашних Web-страничек, как счетчики посещений и гостевые книги. Однако уже к середине 1995 года PHP был дополнен средствами интерпретации данных форм HTML, а также интерфейсом к СУБД mSQL. В результате PHP стал пригоден для создания активных Web-приложений, интегрированных с базами данных.

В 1997 году программисты Zeev Suraski и Andi Gutmans переписали интерпретатор PHP, в результате чего на свет появился PHP версии 3, завоевавший большую популярность у разработчиков Web-приложений.

Современный интерпретатор PHP версии 4 создан компанией Zend Technologies и обладает высокой производительностью и может использоваться со всеми наиболее распространенными Web-серверами, например:

·         Apache;

·         Microsoft Internet Information Server;

·         Microsoft Personal Web Server;

·         FHTTPD;

·         Caudium;

·         Netscape Web-сервер;

·         OmniHTTPd;

·         Oreilly Website Pro;

·         Xitami

Для PHP версий 3 и 4 разработано большое количество библиотек и программных расширений. Кроме того, PHP поставляется со многими операционными системами (например, RedHat Linux) и Web-серверами, оставаясь при этом доступной для бесплатной загрузки из Интернета.

Вот список операционных систем, с которыми совместим интерпретатор PHP:

·         Linux;

·         HP-UX;

·         Solaris;

·         OpenBSD;

·         Mac OS X;

·         Microsoft Windows 95/98/NT/2000/XP

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

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

Сценарии PHP могут работать со многими современными СУБД, поэтому Вы всегда сможете выбрать для себя наиболее подходящий вариант:

 

·         Adabas D

·         dBase

·         Direct MS-SQL

·         Empress

·         FilePro (только чтение)

·         FrontBase

·         Hyperwave

·         IBM DB2

·         Informix

·         Ingres

·         InterBase

·         mSQL

·         MySQL

·         ODBC

·        Oracle

·        Ovrimos

·        PostgreSQL

·        Solid

·        Sybase

·        Unix dbm

·        Velocis

Заметим, что если сценарий PHP работает в среде Microsoft Windows, ему доступны все СУБД с интерфейсом ODBC.

При необходимости для получения более подробной информации Вам следует обращаться к дополнительной литературе, а также к документации, расположенной на Web-узле проекта PHP с адресом http://www.php.net (рис. 10-1).

Заметим, что язык PHP во многом напоминает такие языки как Perl и C, поэтому у Вас не будет трудностей с его изучением. Детальное описание языка сценариев PHP Вы найдете, например, в [20].

Как работают сценарии PHP

В разделе «Пассивные и активные Web-серверы» четвертой главы этой книги, а также в своей книге [1], посвященной разработке Web-приложений для Microsoft Windows, мы подробно описали взаимодействие между браузером посетителя и Web-сервером в процессе просмотра страниц HTML. Напомним вкратце, как осуществляется такое взаимодействие для обычных статических страниц HTML.

Когда посетитель направляет свой браузер по тому или иному адресу URL, этот запрос передается Web-серверу с использованием протокола передачи гипертекстовых данных HTTP. Получив запрос, Web-сервер находит в своих каталогах файл нужной страницы HTML и отправляет его браузеру посетителя (рис. 4-1). В результате посетитель видит содержимое запрошенной страницы в окне браузера.

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

Программы CGI позволяют формировать страницы HTML динамически, создавая их посредством прямого вывода кода HTML в браузер посетителя непосредственно из программы (рис. 4-2). Как мы говорили в 5 главе нашей книги, технология шаблонов позволяет отделить дизайн динамической страницы от исходного текста программы CGI, формирующего эту страницу.

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

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

В дальнейшем мы будем называть Web-приложения, созданные с использованием сценариев PHP, приложениями PHP или PHP-приложениями.

Заметим, что по принципу своего действия сценарии PHP аналогичны сценариям активных серверных страниц Active Server Pages (ASP), разработанных компанией Microsoft для своего Web-сервера Microsoft Internet Information Server (IIS). Подробно мы рассказывали об использовании сценариев ASP в [1].

Помимо отличий в языках программирования, применяемых в PHP и ASP, между этими технологиями имеется и более существенное отличие. В частности, используя модель компонентного объекта Component Object Model (COM), сценарии ASP могут обращаться к серверным элементам управления ActiveX. В составе Web-сервера Microsoft IIS имеется готовый набор таких элементов, о чем мы подробно говорили в [1]. При необходимости Вы можете создавать собственные элементы управления ActiveX, расширяя этот набор.

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

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

Установка интерпретатора PHP

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

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

Установка в среде Linux

Тем, кто создает свои Web-приложения для операционной системы Linux, скорее всего не потребуется загружать дистрибутив интерпретатора PHP из Интернета и устанавливать его. Дело в том, что все основные дистрибутивы Linux (в том числе и RedHat Linux версии 7.1) содержат интерпретатор PHP в своем составе.

В большинстве случаев все, что Вам нужно сделать, чтобы воспользоваться серверными сценариями PHP в среде RedHat Linux версии 7.1, это не забыть об интерпретаторе PHP в процессе начальной установки операционной системы. Соответствующие рекомендации были приведены в разделе «Выбор устанавливаемых компонентов ОС» 2 главы этой книги.

Изменение параметров установки

При необходимости изменить параметры работы PHP придется загрузить исходные тексты интерпретатора PHP из Интернета с Web-узла http://www.php.net (рис. 10-1). Затем нужно заново откомпилировать и скомпоновать модуль PHP, а также модуль Apache (если PHP будет использоваться именно с этим Web-сервером).

Рис. 10-1. Главная страница Web-узла проекта PHP

Подробную инструкцию по сборке модулей PHP самой новой версии Вы найдете в разделе documentation узла http://www.php.net. Кроме того, мы рекомендуем Вам ознакомиться с главой «Установка и конфигурирование PHP» книги [20].

Проверка установки в среде Linux

Для того чтобы проверить правильность установки PHP, запишите в каталог Web-узла файл HTML, исходный текст которого представлен в листинге 10-1.

Листинг 10-1 Вы найдете в файле chap10\www.php.test\root\info.php на прилагаемом к книге компакт-диске.

<html>
<head>
<title>Информация об интерпретаторе PHP</title>
</head>
<body>
<?php
print phpinfo();
?>
</body>
</html>

Здесь конструкции <?php и ?> ограничивают сценарий PHP, встроенный в исходный текст документа HTML. Сценарий состоит всего из одной строки, выводящей в формируемый документ текстовое значение, возвращаемое функцией phpinfo. Если интерпретатор PHP установлен правильно, при загрузке этой страницы в браузер Вы увидите информацию о настройках PHP, полученную с помощью функции phpinfo (рис. 10-2).

Рис. 10-2. Информация об интерпретаторе PHP, входящем в состав RedHat Linux 7.1

На данном этапе можно использовать настройки PHP, установленные по умолчанию, поэтому пока нет необходимости изучать содержимое таблиц настроек PHP.

Установка в среде Microsoft Windows

Если Вы будете использовать PHP в среде операционной системы Microsoft Windows, необходимо загрузить дистрибутивный файл интерпретатора PHP из раздела download Web-узла http://www.php.net (рис. 10-1). Для интерпретатора PHP версии 4.1.0 дистрибутивный файл называется php‑4.1.0-Win32.zip.

Загрузив этот файл, распакуйте его в какой-нибудь каталог, расположенный на диске Web-сервера, например, в каталог c:\php.

После этого скопируйте из каталога c:\php дистрибутивный файл с именем php.ini-dist в системный каталог Microsoft Windows, например, в каталог c:\winnt, и переименуйте в php.ini.

Далее откройте файл php.ini в любом текстовом редакторе (подойдет Notepad) и отредактируйте параметр extension_dir таким образом, чтобы он указывал на каталог с распакованным дистрибутивом PHP:

extension_dir = d:\php

Теперь нужно настроить Web-сервер таким образом, чтобы он «понимал» сценарии PHP. Ваши дальнейшие действия по установке PHP зависят от того, какой Web-сервер Вы будете использовать.

Настройка Apache для работы с PHP

Существует два способа использования PHP для сервера Apache. Первый способ предполагает запуск программы интерпретатора PHP php.exe в качестве программы CGI, а второй — как модуль расширения Apache.

В первом случае для подключения PHP нужно добавить в конфигурационный файл httpd.conf следующие строки:

ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"

Здесь предполагается, что дистрибутив PHP был распакован в каталог c:\php.

Изменив файл httpd.conf, не забудьте перезапустить Apache.

Во втором случае необходимо скопировать в системный каталог Microsoft Windows файл php4ts.dll, а затем добавить в конфигурационный файл httpd.conf две строки:

LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .php

После выполнения всех этих действий перезапустите Apache.

Настройка Microsoft IIS для работы с PHP

Настройка Microsoft IIS для работы с PHP выполняется при помощи программы Internet Services Manager.

Мы рассмотрим этот процесс для операционной системы Microsoft Windows 2000 Server.

Вы можете установить интерпретатор PHP для работы либо в качестве программы CGI, либо в качестве расширения ISAPI (о приложениях ISAPI читайте в [1]). Второй вариант работает быстрее, однако в настоящий момент он недостаточно хорошо отлажен и не рекомендуется к использованию в коммерческих проектах. Поэтому мы ограничимся описанием только первого варианта. При необходимости Вы найдете описание второго варианта в дистрибутивном файле install.txt.

Итак, запустите программу Internet Services Manager и раскройте дерево виртуальных Web-узлов. Затем правой клавишей мыши щелкните название Web-узла, в котором будут использоваться сценарии PHP, и выберите из меню строку Properties (рис. 10-3).

Рис. 10-3. Редактирование свойств виртуального Web-узла

В появившемся окне откройте вкладку Home Directory и щелкните расположенную на ней кнопку Configuration (рис. 10-4).

Рис. 10-4. Вкладка Home Directory

В результате на экране появится диалоговое окно Application Configuration, показанное на рис. 10-5.

Рис. 10-5. Диалоговое окно Application Configuration

Откройте вкладку App Mappings и щелкните кнопку Add, чтобы добавить новое соответствие между расширением имени документа и обрабатывающим его приложением. Нам нужно поставить в соответствие расширению имени php приложение php.exe.

Далее в окне Add/Edit Application Extension Mapping (рис. 10-6) в поле Executable укажите полный путь к программе php.exe, воспользовавшись при необходимости кнопкой Browse, а в поле Extension — расширение имени php.

Рис. 10-6. Окно Add/Edit Application Extension Mapping

Заметим, что для файлов страниц HTML, содержащих сценарии PHP, могут использоваться расширения вида phtml, php3, php4 и др. При необходимости Вы можете добавить соответствия и для этих расширений.

Чтобы повысить скорость работы, снимите отметку с флажка Check that file exists. В этом случае Web-сервер перед запуском сценария PHP не будет каждый раз проверять существование файла php.exe.

Флажок Script engine оставьте отмеченным.

Далее позаботьтесь о безопасности каталога c:\php, установив для посетителей соответствующие права доступа. Посетители должны иметь право выполнять программы, расположенные в этом каталоге, но не читать или изменять файлы. Настройку прав нужно выполнить средствами файловой системы NTFS.

Проверка установки в среде Microsoft Windows

Для проверки правильности установки PHP в среде Microsoft Windows используйте документ HTML, исходный текст которого приведен в листинге 10-1. На рис. 10-7 мы показали результат загрузки этого документа в браузер при использовании PHP совместно с сервером Apache в среде Microsoft Windows 2000 Server.

Рис. 10-7. Интерпретатор PHP установлен как модуль Apache в ОС Microsoft Windows 2000

Просмотр переменных окружения

В нашем первом приложении PHP мы решим простую задачу просмотра содержимого переменных среды Web-сервера (рис. 10-8).

Рис. 10-8. Работа сценария просмотра переменных окружения

Подобную задачу мы уже решали в 5 главе, применив для этого программу CGI, написанную на языке Perl.

Напомним, что с помощью переменных окружения Web-приложение (в нашем случае — PHP-приложение) может получить разнообразную информацию, как о самом сервере, так и об узле посетителя. Это, в частности, адрес IP узла посетителя REMOTE_ADDR и версия браузера HTTP_USER_AGENT.

Анализируя переменную HTTP_REFERER, Web-приложение может определить адрес URL сервера Web, с которого оно было запущено. Это позволяет, например, защитить приложение от несанкционированного использования на других Web-узлах.

В листинге 10-2 Вы найдете исходный текст PHP-приложения, создающего таблицу со значениями некоторых переменных среды, показанную на рис. 10-8.

Листинг 10-2 Вы найдете в файле chap10\www.php.test\root\environment.php на прилагаемом к книге компакт-диске.

<html>
<head>
<title>
Просмотр переменных окружения</title>
</head>
<body>
<h2>
Узел <?php print getenv("HTTP_HOST");?></h2>
<table border=1>
<tr><th width=150 align=left>
Переменная</th>
<th align=left>
Значение</th></tr>
<tr>
<td>REMOTE_ADDR</td><td><?php print getenv("REMOTE_ADDR");?></td>
</tr><tr>
<td>HTTP_HOST</td><td><?php print getenv("HTTP_HOST");?></td>
</tr><tr>
<td>HTTP_USER_AGENT</td>
<td><?php print getenv("HTTP_USER_AGENT");?></td>
</tr><tr>
<td>HTTP_REFERER</td><td><?php print getenv("HTTP_REFERER");?></td>
</tr><tr>
<td>SCRIPT_NAME</td><td><? print getenv("SCRIPT_NAME");?></td>
</tr><tr>
<td>GATEWAY_INTERFACE</td>
<td><? print getenv("GATEWAY_INTERFACE");?></td>
</tr>
</table>
</body>
</html>

Обратите внимание, что для извлечения значения переменных мы использовали здесь встроенную функцию getenv, передавая ей в качестве единственного параметра имя переменной. Для вывода текстовой строки, полученной от функции getenv, мы использовали уже знакомую вам функцию print.

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

Обработка форм

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

Мы будем обрабатывать данные от формы, описанной нами ранее в главе 5 (рис. 5-15). Исходный текст этой формы, измененной для использования сценария PHP, приведен в листинге 10-3.

Листинг 10-3 Вы найдете в файле chap10\www.php.test\root\form.html на прилагаемом к книге компакт-диске.

Чтобы после отправки формы передать управление обрабатывающему сценарию,  мы изменили соответствующим образом значение параметра ACTION тега <FORM>:

<FORM METHOD=POST ACTION="form.php">

Теперь в этом параметре задается адрес файла сценария PHP, а не программы CGI.

Способы получения содержимого полей формы

Существует два способа передачи содержимого полей формы в обрабатывающий ее сценарий PHP. Первый способ основан на применении встроенного массива $HTTP_POST_VARS[], а второй предполагает автоматическое создание глобальных переменных, связанных с полями формы.

Расскажем об этих способах.

Использование массива $HTTP_POST_VARS[]

Когда посетитель заполняет поля формы и отправляет ее на Web-сервер, то для обрабатывающего эту форму сценария PHP автоматически создается словарный массив $HTTP_POST_VARS[]. Ключами в этом массиве являются имена полей формы, определенных при помощи параметров NAME элементов управления формы, а значениями — содержимое полей.

Пусть, например, в форме определено простое текстовое поле с именем TEXT1:

<FORM METHOD=POST ACTION="form.php">
<input type="text" name="TEXT1" value="
Текст" size="30">
<BR><INPUT TYPE=submit VALUE="Send">
</FORM>

При получении данных от этой формы для сценария form.php создается массив $HTTP_POST_VARS[], содержащий элемент с ключом TEXT1.

По умолчанию (если посетитель щелкнул кнопку Send, не изменив поле TEXT1) значением такого элемента будет текстовая строка «Текст». Если же пользователь ввел в данном поле другую строку, программа сможет получить ее по ключу TEXT1:

$form_text1=$HTTP_POST_VARS['TEXT1'];

Искомое значение будет записано в переменную $form_text1.

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

Использование глобальных переменных

Второй способ предполагает автоматическое создание глобальных переменных для всех полей формы. Например, если в форме определено поле <INPUT> с именем TEXT1, для обрабатывающего сценария будет автоматически создана переменная $TEXT1. Этой переменной будет присвоено значение соответствующего поля формы.

Таким образом, для получения значения того или иного поля формы достаточно просто сослаться на соответствующую глобальную переменную:

$form_text1=$TEXT1;

Возможно, Вам покажется, что этот способ проще и лучше, чем первый, так как при его использовании не требуется работать с массивом $HTTP_POST_VARS[]. Однако если сценарий PHP сложный, автоматическое создание глобальных переменных может привести к трудно обнаруживаемым ошибкам. Вы, например, можете перепутать имя глобальной переменной, связанной с полем формы, с именем локальной переменной, определенной в сценарии.

Еще один, более серьезный недостаток второго способа связан с наличием связанной с ним бреши в защите.

В том время как первый способ работает всегда, второй нужно разрешить в файле конфигурации php.ini. Этот файл определяет режимы работы интерпретатора PHP. Чтобы разрешить автоматическое создание глобальных переменных для полей  формы, нужно установить значение параметра register_globals равным on. Заметим, что при установке PHP версии 4 возможность автоматического создания глобальных переменных блокируется.

Несмотря на кажущиеся преимущества, разработчикам Web-приложений не рекомендуется разрешать автоматическое создание глобальных переменных. Эта возможность должна рассматриваться как устаревшая, несмотря на то, что она описана и рекомендуется к применению во многих книгах, посвященных PHP (например, в [20]).

Сценарий для обработки формы

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

Полный текст серверного сценария PHP, получающего и обрабатывающего данную форму, Вы найдете в листинге 10-4.

Листинг 10-4 Вы найдете в файле chap10\www.php.test\root\form.php на прилагаемом к книге компакт-диске.

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

<?php
$form_text1=$HTTP_POST_VARS['TEXT1'];
$form_pwd=$HTTP_POST_VARS['pwd'];
$form_text2=$HTTP_POST_VARS['text2'];

$form_chk1=isset($HTTP_POST_VARS['chk1']);
$form_chk2=isset($HTTP_POST_VARS['chk2']);
$form_chk3=isset($HTTP_POST_VARS['chk3']);

$form_rad=$HTTP_POST_VARS['rad'];
$form_sel=$HTTP_POST_VARS['sel'];
$form_hid=$HTTP_POST_VARS['hid'];
$form_graf_x=$HTTP_POST_VARS['graf_x'];
$form_graf_y=$HTTP_POST_VARS['graf_y'];
?>

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

При формировании выходной страницы наш сценарий отображает в ней полный список всех параметров, полученных от формы в массиве $HTTP_POST_VARS[]:

<p><b>Входные параметры:</b><br>
<?
while (list($key, $val) = each($HTTP_POST_VARS))
{
  print "<br>".$key."=".$val;
}
?>
</p>

Так как массив индексируется при помощи строк (играющих роль ключей), то при помощи функций list, each и оператора while мы получаем список всех имеющихся ключей и соответствующих им значений. Далее этот список отображается в верхней части страницы браузера (рис. 10-9).

Рис. 10-9. Результат обработки формы

Нижняя часть этой страницы формируется сценарием PHP в процессе индивидуальной обработки значений, полученных от полей формы. Расскажем о том, как это происходит.

Однострочное текстовое поле

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

<TR>
<TD VALIGN=TOP>Текстовое поле TEXT</TD>
<TD><input type="text" name="TEXT1" value="Текст" size="30"></TD>
</TR>
<TR>
<TD VALIGN=TOP>Текстовое поле PASSWORD</TD>
<TD><INPUT TYPE=password NAME="PWD" VALUE="Пароль"></TD>
</TR>

Чтобы получить данные из однострочных текстовых полей, мы обращаемся к соответствующим элементам встроенного массива $HTTP_POST_VARS[]:

$form_text1=$HTTP_POST_VARS['TEXT1'];
$form_pwd=$HTTP_POST_VARS['pwd'];

Аналогично извлекается содержимое скрытого поля:

$form_hid=$HTTP_POST_VARS['hid'];

При формировании таблицы, расположенной в нижней части выходной страницы (рис. 10-9), мы подставляем в нее значения соответствующих переменных:

<table border=1 width='100%'><tr><th align=left>Поле формы</th><th align=left>Значение</th></tr>
<tr><td width=250>text1</td><td><?php print $form_text1;?></td></tr>
<tr><td width=250>pwd</td><td><?=$form_pwd?></td></tr>

При этом используется функция print, хотя с таким же успехом можно воспользоваться и оператором echo.

Обратите внимание на упрощенный вариант использования оператора echo:

<?=$form_text2?>

Он лаконичен и особенно удобен для вставки содержимого текстовых переменных в тело формируемой страницы HTML.

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

<tr><td width=250>Скрытый элемент управления</td>
<td><=$form_hid?></td></tr>

Многострочное текстовое поле

Многострочное текстовое поле определено в нашей форме при помощи тега <TEXTAREA>:

<TR>
<TD VALIGN=TOP>Текстовое поле TEXTAREA</TD>
<TD><TEXTAREA NAME="TEXT2" ROWS=4 COLS=30>
Это
  многострочный
    текст
</TEXTAREA></TD>
</TR>

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

$form_text2=$HTTP_POST_VARS['text2'];

Текстовые данные, полученные от многострочного поля, вставляются в выходной документ при помощи упрощенного варианта оператора echo:

<tr><td width=250>text2</td><td><?=$form_text2?></td></tr>

Флажки с независимой фиксацией

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

Мы определили в нашей форме три таких флажка с именами chk1, chk2 и chk3, причем сразу после загрузки формы первый и третий флажок отображаются в отмеченном состоянии:

<INPUT TYPE=CHECKBOX NAME="chk1" VALUE="on" CHECKED>Первый<BR>
<INPUT TYPE=CHECKBOX NAME="chk2" VALUE="on">
Второй<BR>
<INPUT TYPE=CHECKBOX NAME="chk3" VALUE="on" CHECKED>
Третий<BR>

Ниже мы привели фрагмент сценария PHP, извлекающий состояние флажков и сохраняющих это состояние в трех локальных переменных:

$form_chk1=isset($HTTP_POST_VARS['chk1']);
$form_chk2=isset($HTTP_POST_VARS['chk2']);
$form_chk3=isset($HTTP_POST_VARS['chk3']);

Обратите внимание, что значение, извлеченное из массива $HTTP_POST_VARS[], мы дополнительно преобразуем при помощи функции isset.

Для чего потребовалось такое преобразование?

Напомним, что если флажок, расположенный в форме, не установлен, то данные от него не передаются. При попытке извлечь несуществующий элемент из массива $HTTP_POST_VARS[] программа получит значение типа «не определено» или (другими словами) «не установлено».

Функция isset анализирует переменную, переданную ей в качестве параметра. Если эта переменная не определена, функция вернет значение FALSE, а если определена — TRUE.

Таким образом, если флажок не установлен, в соответствующую переменную наш сценарий запишет значение FALSE, а если установлен — TRUE.

Чтобы отобразить в выходном документе состояние флажков с зависимой фиксацией, мы использовали условный оператор if:

<tr><td width=250>Отмеченные флажки CHECKBOX</td><td>
<?php
if($form_chk1) { print "Первый"; }
if($form_chk2) { print " Второй"; }
if($form_chk3) { print " Третий"; }
?>
</td></tr>

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

Флажки с зависимой фиксацией

Из нескольких флажков с зависимой фиксацией, объединенных одним и тем же именем, может быть отмечен только один. В нашем случае мы указали для зависимых флажков имя rad:

<INPUT TYPE=RADIO NAME="rad" VALUE="on1" CHECKED>Первый<BR>
<INPUT TYPE=RADIO NAME="rad" VALUE="on2">
Второй<BR>
<INPUT TYPE=RADIO NAME="rad" VALUE="on3">
Третий<BR>

Для различения флажков, каждому флажку мы присвоили индивидуальное значение при помощи параметра VALUE тега <INPUT>.

Чтобы определить, какой из флажков был отмечен, нам достаточно обратиться к массиву $HTTP_POST_VARS[] один раз:

$form_rad=$HTTP_POST_VARS['rad'];

Значение, соответствующее отмеченному флажку, будет записано в переменную $form_rad.

Чтобы показать в выходном документе HTML состояние флажков с зависимой фиксацией, мы использовали оператор switch:

<tr><td width=250>Отмеченный флажок RADIO</td><td>
<?php
switch ($form_rad)
{
  case "on1": { print "Первый"; break; }
  case "on2": { print "Второй"; break; }
  case "on3": { print "Третий"; break; }
}
?>
</td></tr>

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

Обработка списка

В нашей форме имеется список, содержащий три строки, определенных при помощи тега <OPTION>:

<SELECT NAME="sel" SIZE="1">
  <OPTION Value="Первая строка">Первая строка</OPTION>
  <OPTION Value="Вторая строка">Вторая строка</OPTION>
  <OPTION Value="Ничего не выбрано">Ничего не выбрано</OPTION>
</SELECT>

Аналогично только что рассмотренным флажкам с зависимой фиксацией, с каждой строкой при помощи оператора VALUE связывается то или иное значение.

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

$form_sel=$HTTP_POST_VARS['sel'];

Искомое значение будет записано в переменную $form_sel.

Это значение затем отображается в выходном документе HTML при помощи упрощенного оператора echo:

<tr><td width=250>Выбранная строка списка</td>
<td><?=$form_sel?></td></tr>

Обработка данных от графической кнопки

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

В нашей форме графическая кнопка определена следующим образом:

<INPUT TYPE=IMAGE NAME="graf" SRC="send.gif" BORDER=0>

Когда посетитель щелкает такую кнопку, форма отправляет на сервер два параметра.

При передаче данных программе CGI имена этих кнопок образуются путем добавления к имени кнопки (заданному параметром NAME) суффиксов «.x» и «.y». Первый такой параметр задает координату X, а второй — координату Y курсора мыши в момент щелчка кнопки.

Что же касается сценария PHP, то для него используются суффиксы «_x» и «_y».

Вот как наш  сценарий PHP получает данные, полученные от графической кнопки:

$form_graf_x=$HTTP_POST_VARS['graf_x'];
$form_graf_y=$HTTP_POST_VARS['graf_y'];

Координаты курсора мыши X и Y записываются, соответственно, в переменные $form_graf_x и $form_graf_y.

Прежде чем показывать в выходном документе HTML координаты курсора мыши, мы проверяем, определены ли они (ведь посетитель мог отправить содержимое формы при помощи обычной кнопки Send, а не при помощи графической кнопки):

<?
if(isset($form_graf_x))
{
  print "<tr><td width=250>
Графическая кнопка (координата X)</td><td>".$form_graf_x."</td></tr>";
  print "<tr><td width=250>
Графическая кнопка (координата Y)</td><td>".$form_graf_y."</td></tr>";

?>

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

Если координата X определена, сценарий выводит в формируемый документ код HTML с названиями и значениями координат курсора мыши.

Программа AREFPHP

В разделе «Программа AREF» 5 главы нашей книги мы рассказывали о передаче информации программе CGI при помощи параметра HREF тега <A> с использованием разделительного символа «?». Проанализировав полученные параметры, программа CGI загружала в окно браузера ту или иную страницу HTML.

Аналогичную функциональность можно реализовать и при помощи серверных сценариев PHP.

Ссылки на три различных Web-узла, созданные описанным выше способом, определены в документе arehphp.html (листинг 10-5).

Листинг 10-5 Вы найдете в файле chap10\www.php.test\root\arehphp.html на прилагаемом к книге компакт-диске.

Здесь мы ссылаемся на файл сценария PHP с именем arefphp.php, передавая этому сценарию различные параметры:

<A HREF="arefphp.php?page=1">Издательство "Русская редакция"</A><BR>
<A HREF="arefphp.php?page=2">Microsoft</A><BR>
<A HREF="arefphp.php?page=3">Служба восстановления данных DataRecovery.Ru</A><BR>

Исходный текст сценария arehphp.php приведен в листинге 10-6.

Листинг 10-6 Вы найдете в файле chap10\www.php.test\root\arehphp.php на прилагаемом к книге компакт-диске.

<?php
$form_page=$HTTP_GET_VARS['page'];

switch ($form_page)
{
  case '1':
  {
    header("Location: http://www.rusedit.ru");
    break;
  }
  case '2':
  {
    header("Location: http://www.microsoft.com");
    break;
  }
  case '3':
  {
    header("Location: http://www.datarecovery.ru");
    break;
  } 
  default:
  {
    header("Location: error.html");
    break;
  } 
}
?>

Как видите, в этом документе присутствует только программный код сценария, и нет ни одного тега HTML.

Получив управление, сценарий извлекает параметр page при помощи автоматически созданного массива $HTTP_GET_VARS[].

Обратите внимание, что при обработке формы мы использовали другой массив, а именно массив $HTTP_POST_VARS[]. Это связано с тем, что наша форма передает данные методом POST, а ссылки в документе arehphp.html (листинг 10-5) — методом GET. Соответственно, передаваемые параметры попадают в другой массив.

Как мы уже говорили в 5 главе этой книги, для того чтобы выполнить переадресацию браузера на нужную страницу, необходимо сформировать заголовок HTTP специального вида:

Location: [Адрес URL]\n\n

Когда браузер получает от сервера Web такой заголовок, он отображает документ или файл графического изображения, адрес URL которого указан в заголовке.

Для вывода заголовка HTTP сценарий PHP может воспользоваться специальной функцией header:

header("Location: http://www.datarecovery.ru");

Строка заголовка должна быть передана этой функции без дополнительных завершающих символов "\n\n".

В случае ошибки посетителю отправляется документ с именем error.html.

Как и программа CGI, описанная в разделе «Программа AREF» 5 главы, наш сценарий PHP анализирует параметры, поступающие от браузера через ссылку или поля формы, а затем возвращает ссылки на уже существующие документы в виде их адресов URL.

Работа с Cookie в сценариях PHP

В разделе «Работа с Cookie в программах CGI» 5 главы мы уже рассказывали Вам о том, что такое Cookie и как пользоваться этим элементом в программах CGI. Сценарии PHP также могут работать с Cookie, причем для этого в PHP предусмотрены специальные средства.

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

На использование Cookie накладываются и другие ограничения, о чем мы уже говорили в разделе «Ограничения на использование Cookie» 5 главы.

Рассмотрим выполнение основных операции с Cookie, такие как -создание Cookie, получение и изменение значений параметров Cookie, а также удаление Cookie.

Заголовок HTTP для создания Cookie

Напомним, что для создания Cookie программа CGI или расширение Web-сервера другого типа (в частности, сценарий PHP или ASP) добавляет в заголовок HTTP динамически создаваемого документа HTML поле с именем Set-Cookie. В нем определяются имена и значения параметров Cookie.

Когда программа CGI, сценарий PHP или ASP вызывается из документа HTML, имеющего Cookie, параметры Cookie предаются этому расширению через поле Cookie заголовка HTTP и могут быть проанализированы.

Заголовок HTTP, предназначенный для создания Cookie, выглядит следующим образом:

Set-Cookie: Имя=Значение; expires=Дата_GMT;
path=
Адрес_URL; domain=Домен; secure

Описание отдельных полей заголовка Set-Cookie было приведено ранее в табл. 5-1.

Расскажем о создании этих полей средствами сценариев PHP.

Запись Cookie

Создавая Cookie в программе CGI, для записи соответствующего заголовка HTTP мы использовали  функцию print (см. главу 5). Сценарии PHP могут использовать для этой цели специальную функцию с именем setcookie.

Вот пример использования этой функции:

setcookie("color", $form_new_bg_color);

Здесь мы устанавливаем временный элемент Cookie, который будет храниться в оперативной памяти до завершения работы браузера.

В наиболее общем виде определение функции setcookie выглядит следующим образом:

int setcookie (string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Обязательный параметр name определяет имя Cookie (все остальные параметры функции setcookie не обязательные). В только что приведенном примере мы создали Cookie с именем color.

Значение Cookie определяется необязательным параметром value. Если этот параметр не задан, функция setcookie удаляет Cookie с именем, указанным при помощи параметра name.

При помощи параметра expire можно задать срок действия Cookie. Заметим, что время должно исчисляться в секундах с момента создания операционной системы Unix, то есть с 0 часов 1 января 1970 года (используется время по Гринвичу).

Для определения срока действия Cookie обычно используют функцию time, возвращающую количество секунд, прошедшее с упомянутого выше эпохального события:

setcookie ("color", $form_new_bg_color, time()+3600*24);

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

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

Что же касается параметра secure, то при его установке данные Cookie будут передаваться с использованием протокола HTTPS. Это позволит защитить данные от перехвата по пути от сервера к браузеру посетителя, но не от посягательств недобросовестных администраторов Web-сервера.

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

Получение значения Cookie

Для получения значения Cookie в программах CGI, написанных на языке Perl, мы использовали специальную функцию cookie. Что же касается сценариев PHP, то для них существует два различных способа.

Первый способ предполагает использование автоматически создаваемого глобального ассоциативного массива $HTTP_COOKIE_VARS[]. Чтобы прочитать значение Cookie с заданным именем, необходимо использовать это имя в качестве индекса такого массива:

  $cookie_color=$HTTP_COOKIE_VARS['color'];

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

Для использования этого способа нужно разрешить в файле конфигурации php.ini. Чтобы разрешить автоматическое создание глобальных переменных для Cookies (также как и для полей  формы), нужно установить значение параметра register_globals равным on.

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

Изменение значения параметра Cookie

Если Вам нужно изменить значение параметра Cookie с заданным именем, необходимо записать новое значение с помощью описанной выше функции setcookie.

Удаление Cookie

Чтобы удалить Cookie с заданным именем, используйте следующий способ вызова функции setcookie:

setcookie("color");

Здесь мы удалили значение Cookie с именем color.

Другой способ удаления Cookie предполагает установки срока действия на дату, которая уже прошла, например:

setcookie ("color", $form_new_bg_color, time()-10);

Здесь указана дата, которая прошла 10 секунд назад после запуска сценария.

Пример использования Cookie

Разработчики Web-приложений часто используют Cookie для хранения личных настроек посетителей Web-узлов, таких, например, как параметры дизайнерского оформления страниц, персональная информация, ссылки на те или иные страницы Web-узла и т.п.

В этом разделе мы покажем, как можно применять Cookie для хранения цвета фона страницы, показанной на рис. 10-10.

Рис. 10-10. Страница HTML, цвет фона которой хранится в Cookie

Когда посетитель попадает на эту страницу в первый раз, ее фон имеет белый цвет. С помощью списка, расположенного на странице, посетитель может выбрать один из нескольких цветов фона. Чтобы установить выбранный цвет фона и сохранить его в Cookie, необходимо щелкнуть кнопку Изменить.

После изменения цвета фона в окне браузера появится новая страница (рис. 10-11).

Рис. 10-11. Сообщение об изменении цвета фона

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

Чтобы стереть данные Cookie и вернуть первоначальный цвет фона, нужно щелкнуть кнопку Установить по умолчанию (рис. 10-10). В результате данные Cookie будут стерты из оперативной памяти, а фон страницы станет белым.

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

Листинг 10-7 Вы найдете в файле chap10\www.php.test\root\cookie\index.php на прилагаемом к книге компакт-диске.

<?php
if(isset($HTTP_COOKIE_VARS['color']))
{
  $cookie_color=$HTTP_COOKIE_VARS['color'];
}
else
{
  $cookie_color="#FFFFFF";

?>
<html>
<head>
<title>
Работа с Cookie</title>
</head>
<body bgcolor="<?=$cookie_color?>">
<h2>Хранение цвета фона в Cookie</h2>
<p>Цвет фона этой страницы хранится в Cookie.
Для изменения цвета фона выберите новое значение из списка и щелкните кнопку <b>Изменить.</b></p>
<form action="new_color.php" method="post">
<select name="bg_color">
<option value="#FFFFFF">
Белый</option>
<option value="#008000">
Зеленый</option>
<option value="#ff0000">
Красный</option>
<option value="#ffff00">
Желтый</option>
</select>
<input type="submit" value="
Изменить">
</form>
<p>Чтобы восстановить исходный цвет фона, щелкните кнопку <b>Установить по умолчанию.</b></p>
<form action="set_default.php" method="post">
<input type="submit" value="Установить по умолчанию">
</form>
</body>
</html>

Определение текущего цвета фона

Как видите, в самом начале страницы со сценарием (листинг 10-7) расположен код сценария PHP, проверяющий с помощью функции isset установку Cookie с именем color.

Если данный Cookie установлен, мы читаем его значение из ассоциативного массива $HTTP_COOKIE_VARS[] и сохраняем это значение в переменной  $cookie_color:

$cookie_color=$HTTP_COOKIE_VARS['color'];

В противном случае в эту переменную записывается значение, соответствующее белому цвету:

$cookie_color="#FFFFFF";

Далее мы используем переменную $cookie_color при формировании параметра BGCOLOR тега <BODY>:

<body bgcolor="<?=$cookie_color?>">

В результате цвет фона страницы будет либо белым (если данные Cookie с именем color не установлены), либо таким, который указан в нашем Cookie.

Установка нового цвета фона

Для того чтобы установить новый цвет фона, на странице, исходный текст которой представлен в листинге 10-7, мы поместили небольшую форму со списком bg_color и кнопкой типа submit:

<form action="new_color.php" method="post">
<select name="bg_color">
<option value="#FFFFFF">
Белый</option>
<option value="#008000">
Зеленый</option>
<option value="#ff0000">
Красный</option>
<option value="#ffff00">
Желтый</option>
</select>
<input type="submit" value="
Изменить">
</form>

Если выбрать какой-либо цвет и щелкнуть кнопку Изменить, управление будет передано сценарию new_color.php (листинг 10-8), предназначенному для записи в Cookie нового значения цвета фона.

Листинг 10-8 Вы найдете в файле chap10\www.php.test\root\cookie\new_color.php на прилагаемом к книге компакт-диске.

<?php
$form_new_bg_color=$HTTP_POST_VARS['bg_color'];
setcookie("color", $form_new_bg_color);
?>
<html>
<head>
<title>Работа с Cookie</title>
</head>
<body bgcolor="<?=$form_new_bg_color?>">
<h2>Цвет фона изменен</h2>
<p><a href="index.php">[Назад]</a></p>
<p><a href="http://www.php.test">[На главную]</a></p>
</body>
</html>

Этот сценарий достаточно прост:

$form_new_bg_color=$HTTP_POST_VARS['bg_color'];
setcookie("color", $form_new_bg_color);

Вначале он извлекает значение выбранного цвета из ассоциативного массива $HTTP_POST_VARS[], а затем устанавливает его с помощью уже знакомой Вам функции setcookie.

В нижней части документа, исходный текст которого представлен в листинге 10-8, мы предусмотрели ссылки для обратного перехода на страницу со списком (рис. 10-10), а также на главную страницу Web-узла, созданного специально для иллюстрации материала этой главы.

Установка цвета фона по умолчанию

В нижней части исходного текста документа index.php (листинг 10-7) находится форма с кнопкой Установить по умолчанию:

<form action="set_default.php" method="post">
<input type="submit" value="
Установить по умолчанию">
</form>

С помощью этой кнопки посетитель может удалить Cookie с именем color, восстановив таким способом изначальный цвет фона. Щелкнув кнопку, посетитель инициирует выполнение сценария set_default.php (листинг 10-9), удаляющего Cookie с именем color.

Листинг 10-9 Вы найдете в файле chap10\www.php.test\root\cookie\set_default.php на прилагаемом к книге компакт-диске.

<?php
setcookie("color");
?>
<html>
<head>
<title>
Работа с Cookie</title>
</head>
<body bgcolor="white">
<h2>Цвет фона восстановлен</h2>
<p><a href="index.php">[Назад]</a></p>
<p><a href="http://www.php.test">[
На главную]</a></p>
</body>
</html>

Для удаления Cookie этот сценарий просто вызывает функцию setcookie с единственным параметром — именем удаляемого Cookie:

setcookie("color");

Обмен данными с сервером электронной почты

В разделе 5 главы с названием «Обмен данными с сервером электронной почты» мы рассказывали Вам о том, как программы CGI могут отправлять и получать электронную почту с использованием протоколов SMTP и POP3. Аналогичные возможности есть и у сценариев PHP, в чем Вы скоро сможете убедиться.

Настройка интерпретатора PHP для работы с электронной почтой

Параметры интерпретатора PHP, определяющие режимы работы с электронной почтой, находятся в секции [mail function] конфигурационного файла php.ini. Вот соответствующий фрагмент этого файла:

[mail function]
; For Win32 only.
SMTP = localhost
 
; For Win32 only.
sendmail_from = alexandre@frolov.pp.ru

; For Unix only.  You may supply arguments as well (default: 'sendmail -t -i').
;sendmail_path =

Обычно файл php.ini находится в каталоге /etc (для операционной системы Linux) или в системном каталоге Windows (если интерпретатор PHP используется в среде OC Microsoft Windows).

Настройка для Linux

В случае применения ОС Linux по умолчанию для отправки почты используется программа sendmail и никакой дополнительной настройки обычно не требуется. При необходимости с помощью параметра sendmail_path можно задать программе sendmail, отвечающей в Linux за отправку почты, дополнительные параметры.

Если же в системе вместо sendmail применяется какая-нибудь другая почтовая программа, параметр sendmail_path должен задавать путь к файлу этой программы. Например, для программы Qmail нужно использовать значение /var/qmail/bin/sendmail.

Настройка для Microsoft Windows

Что же касается ОС Microsoft Windows, то и здесь после некоторой настройки интерпретатор PHP сможет работать напрямую с сервером SMTP.

Настройка заключается в установке параметров SMTP и sendmail_from:

[mail function]
; For Win32 only.
SMTP = my.smtp.server

; For Win32 only.
sendmail_from = alexandre@frolov.pp.ru

; For Unix only.  You may supply arguments as well (default: 'sendmail -t -i').
;sendmail_path =

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

Параметр sendmail_path в этом случае не используется и его указывать не нужно.

Отправка почты с помощью функции mail

Специально для работы сценариев PHP с электронной почтой предусмотрена удобная в использовании функция mail. Прототип этой функции представлен ниже:

bool mail (string to, string subject, string message [, string additional_headers [, string additional_parameters]])

Первые три параметра функции mail обязательные. Через первый параметр этой функции передается адрес получателя, через второй — тема сообщения, а через третий — текст сообщения.

Необязательный параметр  additional_headers позволяет добавить к сообщению дополнительные заголовки (такие как From и Reply-To). Что же касается параметра additional_parameters, появившегося в PHP версии 5.0.5, то он позволяет задать дополнительные параметры для почтовой программы, сконфигурированной в файле php.ini при помощи параметра sendmail_path.

Чтобы показать простейший способ использования функции  mail для отправки почты, мы подготовили небольшую форму, показанную на рис. 10-12.

Рис. 10-12. Форма для отправки электронной почты

Здесь Вы можете ввести адрес получателя почты, тему сообщения, а также текст сообщения. Щелкнув кнопку Send Mail, Вы отправите сообщение по электронной почте.

Если отправка выполнится без ошибок, в окне браузера появится сообщение, показанное на рис. 10-14. При возникновении каких либо ошибок об этом Вы тоже узнаете из аналогичного сообщения.

Рис. 10-13. Сообщение об успешной отправке почты

Исходный текст формы, показанной на рис. 10-12, приведен в листинге 10-10.

Листинг 10-10 Вы найдете в файле chap10\www.php.test\root\cookie\email.html на прилагаемом к книге компакт-диске.

<html>
<head>
<title>
Отправка электронной почты</title>
</head>
<body>
<h2>
Отправка электронной почты</h2>

<form action="send_mail.php" method="post">
<table>
<tr><td>To:</td><td><input name="to"></td></tr>
<tr><td>Subject:</td><td><input name="subject"></td></tr>
<tr><td>Message:</td><td><textarea cols="40" rows="5" name="message"></textarea></td></tr>
<tr><td>Subject:</td><td><input type="submit" value="Send Mail"></td></tr>
</table>
</form>
</body>
</html>

Как видите, в этой форме определены текстовые поля ввода с именами to, subject и message. Если щелкнуть кнопку Send Mail, содержимое этих полей будет передано сценарию send_ mail.php (листинг 10-11).

Листинг 10-11 Вы найдете в файле chap10\www.php.test\root\cookie\semd_mail.php на прилагаемом к книге компакт-диске.

<?php
$form_to=$HTTP_POST_VARS['to'];
$form_subject=$HTTP_POST_VARS['subject'];
$form_msg=$HTTP_POST_VARS['message'];

if(mail ($form_to, $form_subject, $form_msg) == TRUE)
{
?>
<html>
<head>
<title>Почта успешно отправлена</title>
</head>
<body>
<p>Почта успешно отправлена</p>
<?php
}
else
{
?>
<html>
<head>
<title>Ошибка при отправке почты</title>
</head>
<body>
<p>Ошибка при отправке почты</p>
<?php
}
?>
</body>
</html>

Получив управление, этот сценарий извлекает переданные ему параметры из глобального ассоциативного массива $HTTP_POST_VARS[] и передает их функции mail.

При успешном завершении процесса отправки почты функция mail возвращает значение TRUE. В этом случае сценарий PHP формирует документ HTML с текстом об успешном выполнении операции.

Если же при отправке почты произошла ошибка, пользователю отправляется другое сообщение.

Шаблоны HTML в сценариях PHP

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

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

Один из наиболее известных и хорошо описанных в [20] пакетов PHP, с помощью которых можно использовать шаблоны, это пакет FastTemplate. Его можно найти в Интернете с помощью поисковых систем по названию. 

Наиболее существенным недостатком пакета FastTemplate является, на наш взгляд, его ориентированность на устаревшую версию интерпретатора PHP, а именно на версию 3. И хотя в Интернете имеются исправления к этому пакету, позволяющие использовать его в PHP версии 4, с их помощью не всегда удается избавиться от ошибок. Кроме того, отсутствие современной авторской версии пакета наводит на размышления о том, что автор забросил свое детище. Такая ситуация часто возникает в мире бесплатного программного обеспечения, создаваемого на любительской основе.

В нашей книге мы рассмотрим другой пакет — класс Template, созданный программистом по имени Richard Heyes. Дистрибутив этого бесплатного пакета можно найти на Web-узле phpGuru.org по адресу http://www.phpguru.org/template.html (рис. 10-14).

Рис. 10-14. Раздел шаблонов на Web-узле http://www.phpguru.org

Состав дистрибутива класса Template

В разделе download area странички, показанной на рис. 10-14, Вы сможете загрузить файл template.class-1.4.tar.gz. Это дистрибутивный файл класса Template версии 1.4, самой новой версии на момент создания нашей книги.

Распакуйте содержимое архива template.class-1.4.tar.gz во временный каталог. В табл. 10‑1 мы привели список файлов дистрибутива с описанием их назначения.

Таблица 10-1. Дистрибутивные файлы класса Template

Файл

Описание

documentation.html

Краткая документация для класса Template (на английском языке)

class.template.inc

Программный файл сценария с определением класса Template

complete-script.php

Пример сценария PHP, использующего класс Template

header.html, complete-template.html

Два шаблона HTML для сценария complete-script.php

Для создания собственных проектов в первую очередь Вам понадобится файл class.template.inc, содержащий определение класса Template. Этот файл необходимо скопировать в каталог с другими сценариями PHP Вашего Web-приложения.

Вы также можете ознакомиться с документацией, хранящейся в файле documentation.html. Помимо собственно класса Template, в документации описан пример сценария complete-script.php.

Учтите, что в следующих версиях класса Template состав дистрибутивных файлов может быть изменен.

Три типа шаблонов

С помощью класса Template можно создавать шаблоны трех типов:

·         простые шаблоны;

·         циклические шаблоны;

·         условные шаблоны

Вы уже встречались с шаблонами этих типов в 5 главе, создавая их при помощи модуля Perl с названием HTML::Template.

Простые шаблоны

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

Вот пример такого тега:

<h2>Узел {HTTP_HOST}</h2>

Здесь конструкция {HTTP_HOST} представляет собой простой шаблон, встроенный в заголовок документа HTML, сформированный с помощью тега <H2>. Во время работы сценарий PHP заменит эту конструкцию содержимым переменной с именем $HTTP_HOST. Разумеется, предварительно эта переменная должна быть определена и проинициализирована сценарием.

Циклические шаблоны

Циклические шаблоны незаменимы при подготовке сценарием PHP различного рода таблиц. Эти шаблоны создаются с помощью тегов <LOOP> и </LOOP>, как это показано ниже:

<LOOP NAME="env">
<tr><td>{column_1}</td><td>{column_2}</td></tr>
</LOOP NAME="env">

Здесь циклический шаблон формирует повторяющуюся строку таблицы. Содержимое ячеек такой таблицы формируется сценарием PHP динамически.

Имя циклического шаблона определяется параметром NAME тега <LOOP>. В одном файле шаблонов можно определить несколько циклических шаблонов, указав для них разные имена.

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

Условные шаблоны

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

Условные шаблоны создаются с помощью тега <IF> и снабжаются именем. Имя условного шаблона, как и имя циклического шаблона, задается параметром NAME. В одном файле шаблонов может быть использовано несколько условных шаблонов.

Ниже показан пример условного шаблона, применяемого для вставки в документ HTML сообщения об ошибке подключения к базе данных:

<IF NAME="dberror">
<p>Ошбика при подключении к базе данных</p>
</IF NAME="dberror">       

Если сценарий, работающий с этим шаблоном, установил в TRUE значение переменной $dberror, в текст документа HTML будет вставлено сообщение об ошибке. Если же содержимое переменной равно FALSE или если эта переменная не определена, сообщение об ошибке не появится.

Пример использования простого шаблона

Для того чтобы продемонстрировать использование простых шаблонов, создадим страничку HTML с таблицей, отображающей содержимое некоторых переменных окружения Web-сервера. Напомним, что мы уже решали эту задачу в разделе «Просмотр переменных окружения» этой главы, но без использования шаблонов.

Исходный текст файла шаблонов

Исходный текст файла шаблонов, подготовленный нами для этого примера, представлен в листинге 10-12.

Листинг 10-12 Вы найдете в файле chap10\www.php.test\root\templates\sample1/template.html на прилагаемом к книге компакт-диске.

<html>
<head>
<title>Просмотр переменных окружения</title>
</head>
<body>
<h2>Узел {HTTP_HOST}</h2>
<table border=1>
<tr><th width=150 align=left>Переменная</th><th align=left>Значение</th></tr>
<tr><td>REMOTE_ADDR</td><td>{REMOTE_ADDR}</td></tr>
<tr><td>HTTP_HOST</td><td>{HTTP_HOST}</td></tr>
<tr><td>HTTP_USER_AGENT</td><td>{HTTP_USER_AGENT}</td></tr>
<tr><td>HTTP_REFERER</td><td>{HTTP_REFERER}</td></tr>
<tr><td>SCRIPT_NAME</td><td>{SCRIPT_NAME}</td></tr>
<tr><td>GATEWAY_INTERFACE</td><td>{GATEWAY_INTERFACE}</td></tr>
</table>
</body>
</html>

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

Файл шаблона можно просматривать в браузере (рис. 10-15) и редактировать при помощи любого редактора HTML, в том числе допускающего визуальное редактирование документов HTML. Это возможно благодаря тому, что простые шаблоны отображаются в этом файле как обычные текстовые строки.

Рис. 10-15. Просмотр файла шаблона в браузере

После того как сценарий PHP заполнит простые шаблоны, страница HTML примет вид, показанный на рис. 10-16.

Рис. 10-16. Просмотр значений переменных окружения с помощью шаблонов

Сценарий PHP для заполнения шаблона

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

Листинг 10-13 Вы найдете в файле chap10\www.php.test\root\templates\sample1/index.php на прилагаемом к книге компакт-диске.

<?php
include('class.template.inc');

$HTTP_HOST=getenv("HTTP_HOST");
$REMOTE_ADDR=getenv("REMOTE_ADDR");
$HTTP_HOST=getenv("HTTP_HOST");
$HTTP_USER_AGENT=getenv("HTTP_USER_AGENT");
$HTTP_REFERER=getenv("HTTP_REFERER");
$SCRIPT_NAME=getenv("SCRIPT_NAME");
$GATEWAY_INTERFACE=getenv("GATEWAY_INTERFACE");

$tpl = new template;
$tpl->load_file('template', 'template.html');
$tpl->register('template', 'HTTP_HOST, REMOTE_ADDR, HTTP_HOST, HTTP_USER_AGENT, HTTP_REFERER, SCRIPT_NAME, GATEWAY_INTERFACE');

$tpl->parse('template');
$tpl->print_file('template');
?>

Как видите, наш сценарий не содержит ни единого тега HTML. Таким образом, применяя шаблоны, мы полностью отделили дизайн страницы от программных компонент.

В самом начале в сценарии расположен оператор include, необходимый для обращения к методам класса Template:

include('class.template.inc');

Этот оператор вставляет в исходный текст сценария содержимое дистрибутивного файла class.template.inc с определением класса Template. Предполагается, что Вы скопируете данный файл в тот же каталог, где находится сценарий, работающий с шаблонами.

В следующих строках сценария мы получаем значения переменных окружения и сохраняем их в переменных сценария PHP:

$HTTP_HOST=getenv("HTTP_HOST");
$REMOTE_ADDR=getenv("REMOTE_ADDR");
$HTTP_HOST=getenv("HTTP_HOST");
$HTTP_USER_AGENT=getenv("HTTP_USER_AGENT");
$HTTP_REFERER=getenv("HTTP_REFERER");
$SCRIPT_NAME=getenv("SCRIPT_NAME");
$GATEWAY_INTERFACE=getenv("GATEWAY_INTERFACE");

Эти переменные будут использованы для заполнения простых шаблонов, поэтому их имена совпадают с именами этих шаблонов.

Теперь нам нужно заполнить и отобразить шаблон.

Чтобы сделать это, сценарий PHP, прежде всего, должен создать объект класса Template с помощью оператора new:

$tpl = new template;

После этого сценарий может обращаться к методам класса Template.

Первым вызывается метод load_file, загружающий в оперативную память файл шаблона:

$tpl->load_file('template', 'template.html');

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

В качестве второго параметра методу load_file передается полный или относительный путь к файлу шаблона.

На следующем этапе сценарий должен зарегистрировать имена переменных, используемых для заполнения простых шаблонов. С этой целью вызывается метод register:

$tpl->register('template', 'HTTP_HOST, REMOTE_ADDR, HTTP_HOST, HTTP_USER_AGENT, HTTP_REFERER, SCRIPT_NAME, GATEWAY_INTERFACE');

В качестве первого параметра методу register передается идентификатор шаблона, а в качестве второго — текстовая строка с перечислением имен регистрируемых переменных, разделенных запятой. Обратите внимание, что здесь передаются не значения переменных, а только их имена.

После регистрации можно приступить к вставке содержимого переменных в шаблон. Это делает метод parse:

$tpl->parse('template');

На заключительном этапе сценарий отправляет подготовленную страницу в браузер посетителя, вызывая для этого метод print_file:

$tpl->print_file('template');

Пример использования циклического шаблона

Чтобы показать использование циклических шаблонов, мы построим таблицу с содержимым всех переменных окружения Web-сервера (рис. 10-17). Аналогичную таблицу мы строили в 5 главе средствами Perl с применением шаблонов HTML::Template.

Рис. 10-17. Результат использования циклических шаблонов

Исходный текст файла шаблонов

Исходный текст файла c одним простым и одним циклическим шаблоном представлен в листинге 10-14.

Листинг 10-14 Вы найдете в файле chap10\www.php.test\root\templates\sample2/template.html на прилагаемом к книге компакт-диске.

<html>
<head>
<title>Просмотр переменных окружения</title>
</head>
<body>
<h2>Узел {HTTP_HOST}</h2>
<table border=1>
<tr><th width=150 align=left>Переменная</th><th align=left>Значение</th></tr>

<LOOP NAME="env">
<tr><td>{column_1}</td><td>{column_2}</td></tr>
</LOOP NAME="env">

</table>
</body>
</html>

Простой шаблон {HTTP_HOST} используется для отображения доменного имени узла Web-сервера, а циклический — для формирования таблицы значений всех переменных окружения Web-сервера.

Сценарий PHP для заполнения шаблона

Исходный текст сценария PHP, заполняющего наши шаблоны и отображающего таблицу переменных окружения, приведен в листинге 10-15.

Листинг 10-15 Вы найдете в файле chap10\www.php.test\root\templates\sample2/index.php на прилагаемом к книге компакт-диске.

<?php
include('class.template.inc');

$HTTP_HOST=getenv("HTTP_HOST");

$env = array();

$i=0;
while (list($key, $val) = each($HTTP_SERVER_VARS))
{
  $env[$i]['column_1'] = $key;
  $env[$i]['column_2'] = $val;
  $i++;
}

$tpl = new template;
$tpl->load_file('template', 'template.html');
$tpl->parse_loop('template', 'env');
$tpl->pprint('template', 'HTTP_HOST');
?>

Как и в предыдущем примере, мы включаем в исходный текст сценария содержимое дистрибутивного файла класса Template:

include('class.template.inc');

Для заполнения простого шаблона мы инициализируем переменную $HTTP_HOST адресом IP нашего Web-сервера:

$HTTP_HOST=getenv("HTTP_HOST");

Что же касается циклического шаблона, то для его заполнения нам потребуется подготовить двухмерный массив и проинициализировать его в цикле:

$env = array();
$i=0;
while (list($key, $val) = each($HTTP_SERVER_VARS))
{
  $env[$i]['column_1'] = $key;
  $env[$i]['column_2'] = $val;
  $i++;
}

Здесь мы получаем в переменных $key и $val имена переменных окружения и соответствующие им значения. Имена используются для инициализации первого столбца таблицы, отмеченной в шаблоне конструкцией {column_1}, а  значения — для инициализации второго столбца таблицы. При этом первый индекс массива задает номер строки заполняемой таблицы, а второй — столбец таблицы.

Когда исходные данные, необходимые для заполнения шаблонов, подготовлены, можно создавать объект класса Template и загружать файл шаблонов:

$tpl = new template;
$tpl->load_file('template', 'template.html');

Для вставки содержимого циклических шаблонов необходимо использовать метод parse_loop:

$tpl->parse_loop('template', 'env');

В качестве первого параметра этому методу следует передать идентификатор шаблона, а в качестве второго — имя циклического шаблона, определенного параметром NAME тега <LOOP> (листинг 10-14).

И, наконец, финальная часть сценария, ответственная за отправку заполненного шаблона в браузер посетителя:

$tpl->pprint('template', 'HTTP_HOST');

Вместо метода print_file мы использовали здесь метод pprint, позволяющий автоматически привязывать переменные простых шаблонов, заполнять их и отправлять результат посетителю. Этот метод можно использовать и для работы с простыми шаблонами вместо методов register, parse и print_file.

[Назад] [Содержание] [Дальше]