Когда мы впервые пускаемся в путешествие по сети Интернет, нас удивляют и поражают новые ранее невиданные возможности, открывающиеся перед нами прямо на экране домашнего компьютера. Чтобы пуститься в это путешествие, нам необходим всего лишь компьютер и телефонная линия. Компьютер оснащен необходимым для его работы программным обеспечением и модемом, с помощью которого он может общаться с удаленными «братьями по разуму», т.е. с подобными себе компьютерами. А чтобы общение компьютера с другими компьютерами было понятно для человека, разработаны специальные интерфейсы, облегчающие общение человека с компьютером и компьютера с человеком.
Самым распространенным средством для работы в Интернете в настоящее время представляются программы-броузеры, т.е. программы, позволяющие пользователю осуществлять непринужденное «брожение», «плавание» по сети Интернет, незаметно для него самого «перескакивая» из одного места («сайта») сети в другое, причем физически такие сайты могут быть отделены друг от друга расстояниями в десятки тысяч километров. Большие расстояния незаметны пользователю, на компьютере которого установлен броузер.
Существует несколько широкоизвестных программ-броузеров, кроме того, существует большое количество малоизвестных программ-броузеров и огромное количество программ, использующих стандартные возможности программ-броузеров. Общим для них всех является то, что эти программы устанавливаются на компьютере пользователя. Эти программы являются клиентскими программами. Это означает, что они способны инициировать запросы, отправлять их по сети Интернет другим программам, называемым серверами, ожидать, получать и обрабатывать ответы, полученные от программ-серверов.
Партнерами клиентских программ являются серверные программы, програм-мы-сереверы. Программа-сервер «прослушивает» сеть (это может быть необязательно сеть, так как клиент и сервер могут быть установлены и на одной машине, и более того, одна и та же программа может быть одновременно как клиентом, так и сервером) в ожидании запроса клиента. После поступления такого запроса, сервер принимает его, обрабатывает и посылает ответ клиенту.
Примерами клиентских программ могут служить программы-броузеры. Однако, это не единственный вариант реализации клиентских приложений. Клиентскими программами являются, например, почтовые программы, такие как, например, Microsoft Outlook или Outlook Express и другие. Существует большое количество клиентов-игр и соответствующих им игровых серверов, немало встречается клиентов интернет-телефон ии, работающих с бесплатными (временно) серверами, помогающими осуществлять телефонные звонки с домашнего компьютера в любую точку мира по номеру телефона. Существует большое числопрограмм для прослушивания радио- и видеоинформации в Интернет в реальном времени, использующих потоковые файлы, передаваемые сервером клиенту в режиме, напоминающем теле- или радиовещание.
Однако, более всего наше внимание привлекают программы-броузеры. Это можно объяснить тем, что информация, представляемая в броузере, главным образом является графической и текстовой информацией, и именно такая информация наиболее доступна для большого числа пользователей. Любой человек, даже немного знакомый с компьютером, может набрать текст, сохранить картинку, создать документ, составить отчет, сделать Web-сайт своими руками так, как ему это будет удобно. При этом он имеет дело главным образом с текстом, графикой, их сочетаниями, и, немного, с аудиоинформацией. И именно такой вид информации наиболее полно может быть представлен пользователю Интернет, если пользователь воспользуется именно программой-броузером.
Современные броузеры предоставляют пользователю довольно большие возможности. Основным типом документов, с которыми работает броузер, являются HTML-документы, т.е. документы, использующие язык разметки гипертекста, язык HTML. Основной функцией броузера, как программы-клиента, осуществляющей связь с сервером, является формирование запроса HTML-файла и получение этого файла с сервера. Наиболее распространенным (но не единственным) при передаче файлов сервером броузеру является протокол передачи гипертекста, протокол http. В заголовках передаваемых с применением этого протокола файлов содержится информация для броузера, согласно которой броузер может определить способ обработки получаемого файла.
После того (и в процессе того) как броузер получил запрашиваемый файл, он приступает к его обработке в соответствии с инструкциями (ярлыками) HTML, которые встроены непосредственно в HTML-файл. Такой файл главным образом состоит из текста, графических элементов (в виде встроенных страниц и назначенных цветов для элементов), причем как текст, так и графические элементы (картинки) могут быть отформатированы, а исходные данные (текст, графический файл) могут находиться как внутри полученного HTML-файла, так и храниться в виде самостоятельного файла в любом месте глобальной сети. В последнем случае HTML-файл будет содержать лишь ссылку на них. Броузер интерпретирует всю информацию, содержащуюся в полученном HTML-файле, и выводит на экран компьютера результат, который понятен конечному пользователю.
Основными элементами языка HTML являются ярлыки, которые представляют собой стандартные слова, помещенные в скобки «<...>». Такие ярлыки используются для осуществления «статического» форматирования тексто-графичес-кой информации. Броузеры позволяют осуществлять динамическое изменение внешнего вида (и других компонентов) представляемой информации. Способы такого изменения можно описать с использованием языков сценариев. Сценарии могут быть написаны, например, на языке JavaScript, а текст сценария помещен непосредственно в тот же HTML-файл, что и исходная тексто-графическая информация. JavaScript позволяет создавать весьма сложные программы. Эти программы выполняются программой-броузером в режиме интерпретации. Этим обуславливается медлительность в их выполнении. Броузеры имеют возможности выполнять и более совершенные программные модули, которые загружаются в виде Java-классов, элементов ActiveX, т.е. в виде готовых оттранслированных бинарных файлов программ. Однако, выполнение эти*х программ возможно лишь после того, как будет осуществлена установка этих программ в систему. Установка внешних программ на свой компьютер сопряжена с определенным риском, так как такая программа (в отличие от программы-сценария в чистом виде), потенциально может осуществить несанкционированный доступ к ресурсам системы. Такие элементы, как ActiveX и классы Java, являются платформенно независимыми в определенной степени модулями. Но и эта независимость оказывается зависимой от конкретной реализации программы-клиента, а также от претензий основных производителей программного обеспечения подобного рода, т.е. от того, в коей мере внешние продукты согласуются с подходами, принятыми в компаниях, например, Netscape или Microsoft.
HTML-файл хранится в памяти (например, на жестком диске) машины в каталоге, доступном web-серверу, и по запросу клиента посылается ему в исходном виде, т.е. в том виде, в каком он был первоначально создан и сохранен, без внесения предварительных (перед отсылкой) изменений. Этот файл может содержать инструкции для динамической обработки его содержания на клиенте, но сервер не будет иметь возможности изменить содержание отсылаемого HTML-файла.
Существуют возможности внести коррективы в отсылаемый клиенту HTML-файл. Для этого используются серверные скрипты. Существует множество вариантов создания серверных скриптов, для этого используются различные языки, в том числе для таких целей можно использовать любые стандартные языки, например, язык Java или С. Однако, есть возможность воспользоваться наиболее компактными языками, разработанными специально для написания программ серверных сценариев, и одним из таких языков является язык РНР, который становится все более популярным.
ЧТО ТАКОЕ РНР
Что такое РНР?
PHP — это один из наиболее популярных языков программирования, используемый при написании серверных программ-сценариев. Этот язык является весьма компактным (в смысле написания на нем программ, некоторые задачи (например, простые счетчики посещений и т.п.) могут быть решены средствами РНР буквально в две строчки. Особенностью этого языка является то, что коды РНР могут быть вставлены непосредственно в HTML-файл, т.е. конструкции языка РНР вставляются в исходную HTML-разметку подобно тому, как клиентские сценарии вставляются в ту же HTML-страницу. Это предоставляет дополнительные удобства при написании РНР сценариев.
Перед тем, как HTML-файл будет отправлен сервером по запросу клиента, необходимо выполнить РНР инструкции, вставленные в HTML-файл. Чтобы эти инструкции могли быть выполнены, необходимо на Web-сервере установить тот или иной вариант РНР. Поскольку после запроса клиента простой HTML-файл будет отправлен без изменений и предварительного анализа, необходимо заранее позаботиться о том, чтобы файл с функциями и инструкциями языка РНР перед отправкой клиенту был обработан на сервере. Для этого серверу необходимо знать, какой тип файлов перед отправкой клиенту следует подвергнуть обработке РНР интерпретатора. Для этого при установке и конфигурировании модуля РНР на сервере указывается список расширений файлов, обрабатываемых интерпретатором РНР. Этого мы еще коснемся в дальнейшем.
Изначально язык PHP появился в виде персонального проекта, разработанного Расмусом Лердорфом в первой половине девяностых годов. Благодаря быстрорастущей популярности язык неоднократно усовершенствовался, чтобы удовлетворять постоянно растущие потребности программистов и был почти полностью создан заново уже группой разработчиков. Дистрибутив распространяется бесплатно, имеются реализации языка для различных платформ. Основным преимуществом этого языка является то, что в нем использованы наиболее популярные при программировании серверных сценариев возможности нескольких широкоизвестных языков, в том числе таких, как Java, С, Perl. Структура программ весьма проста, и если новичок имел пусть небольшой опыт использования языков программирования, язык РНР не будет представлять для него большой трудности. Язык содержит в себе множество встроенных заранее определенных функций, выполняющих наиболее часто встречающиеся при программировании серверных задач процедур. Большое количество функций связано с работой с различными базами данных (MySQL, Oracle, Sybase, mSQL, Generic ODBC, PostgreSQL), организацией передачи данных по сетям, работой с файловой системой, работой с идентификаторами пользователя и т.п. Язык позволяет производить сложные математические вычисления, работать с почтой, регулярными выражениями, обрабатывать пользовательские формы и осуществлять множество других действий. Одним из факторов, делающим этот язык столь мощным средством программирования, является его ориентированность на решение конкретных задач, возникающих на серверной стороне.
Резюмируем сказанное еще раз. РНР — это серверный язык сценариев. Для того, чтобы программа-скрипт, написанная на РНР могла работать, необходимо установить и сконфигурировать РНР-интерпретатор на Web-cepвepe. При конфигурировании указываются каталоги сервера, где могут быть расположены PHP-файлы, а также расширения этих файлов. Файлы с указанными расширениями после обращения клиента о передаче ему таких файлов, будут предварительно обработаны PHP-интерпретатором. Чтобы иметь возможность создавать РНР- файлы необходимо удостовериться, обратившись к интернет-провайдеру, в том, что каталог, в котором расположены ваши HTML и РНР странички на Web-сервере провайдера, «обслуживается» интерпретатором РНР, т.е. что к вашему каталогу существует доступ для установленного на сервере провайдера PHP-интерпретатора, а также в том, что такой интерпретатор вообще установлен на сервере провайдера. Другой вариант решения вопроса о том, где можно интерпретировать серверные скрипты, состоит в том, чтобы самому стать администратором своего собственного web-сервера и установить на нем РНР-интерпретатор. Стандартными расширениями PHP-файлов являются расширения РНР, РНРЗ, РНР4, PHTML.
Наш первый РНР-файл
Инструкции языка РНР могут быть вставлены непосредственно в HTML-код стандартной web-страницы. Такой метод позволят с легкостью осуществлять возможность динамического изменения отсылаемой клиенту web-страницы перед тем, как измененный в соответствии с РНР инструкциями HTML-код будет отправлен клиенту (броузеру).
В качестве первого примера мы рассмотрим самый примитивный РНР файл (first.php):
<HTML>
<HEAD>
<TITLE>Haш первый PHP сценарий</ТIТLЕ>
</HEAD>
<BODY>
<CENTER>Этa страница создана с использованием PHP</CENTER>
<?
/* Знак "<?" обозначает начало РНР сценария */
echo ("Эта строка выведена с помощью РНР сценария");
/* Знак "?>" обозначает конец сценария */
?>
</body>
</html>
Прежде чем продолжить работу с эти файлом, напомним, что HTML-ярлык <HTML> сообщает нам о том, что данный файл является (в основном) HTML-файлом, ярлык <head> содержит заголовок файла с его названием, указанным в ярлыке <title>, ярлык <body> содержит основную информацию, основные данные HTML-файла. РНР- код помещен между знаками <? и ?>. В нашем примере РНР помещены между /* и */. Функция echo используется для вывода содержимого аргумента.
Понятно, что такое использование РНР вряд ли можно назвать эффективным, так как вывод стационарного текста гораздо удобнее осуществлять средствами HTML, не прибегая к помощи РНР. Немного усложним файл, вставим в него возможность посылать пользователю текущую системную дату машины, на которой установлен сервер, для этого используем функцию date(). Отметим, что идентификаторы переменных в РНР начинаются с символа $ (Примета гласит: «Приснился РНР — к деньгам»). Сохраним файл как firstl.php.
Файл firstl.php
<HTML>
<HEAD>
<TITLE>Haш первый PHP сценарий</ТIТLЕ>
</HEAD>
<BODY>
<CENTER>Этa страница создана с использованием PHP</CENTER>
<?
/* Знак "<?" обозначает начало РНР сценария */
echo ("Эта строка выведена с помощью РНР сценария");
$today = date("Y-m-d");
echo ("<CENTER >Сегодня $today.</CENTER>");
/* Знак "?>" обозначает конец сценария */
?>
</body>
</html>
Мы написали наш первый простой РНР сценарий. Давайте попробуем выполнить его.
Сохраним файл first l.php в произвольном месте на диске компьютера, откроем броузер, например, Microsoft Internet Explorer, и впишем в адресной строке путь и имя этого файла, как показано на рис. 1.1. И нажимаем клавишу Enter.
Но что-то не так... окно броузера остается пустым, а в заголовке в панели броузера содержится надпись «Сервер не найден» (рис. 1.2). Это и не удивительно, потому что для того, чтобы мы смогли получить полноценный HTML-файл, к тому же еще обработанный РНР-интерпретатором, исходный PHP-файл должен находиться в том каталоге, который отведен для PHP-файла каким-либо web-сервером. А мы «положили» наш первый PHP-файл first.php в такой каталог, который недоступен ни одному web-серверу.
Как быть? Пусть мы не располагаем доступом к web-серверу, но мы все же можем интерпретировать наш файл firstl.php. Для этого можно воспользоваться программой РНР.ехе, работающей в DOS. Для этого запускаем сеанс DOS, а для удобства (это, естественно, совершенно необязательно) вызываем какую-либо оболочку для работы с файлами, например, Norton Commander. Находим каталог, в котором располагается программа php.exe, копируем в него наш файл first l.php и пишем команду DOS в виде
php firstl.php
Нажимаем Enter (см. рис. 1.3).
Ваш компьютер слегка задумается, немного пошуршав винчестером, и выдаст что-то вроде того, что изображено на рис. 1.4. Это HTML-код, который мог бы быть отправлен клиенту (броузеру), если бы файл firstl.php находился на сервере. «Абракадабра» появилась ввиду того, что на машине, которая использовалась при создании рисунка, DOS не осуществляет перекодировку русских символов. При пересылке файла броузеру и его дальнейшей обработке этот недостаток устраняется.
Это наиболее простой способ проверки PHP-скриптов. Если скрипт содержит ошибки, то появятся сообщения об ошибках. Эти ошибки легко могут быть найдены и устранены (рис. 1.5).
Использование модуля php.exe — это простейший путь «применения» интерпретатора языка РНР для учебных целей. Однако этот способ не решает главной цели, т.е. созданные PHP-коды не будут отправлены программе-броузеру. Чтобы сгенерированный при помощи РНР код был отправлен броузеру, нам необходимо иметь web-cepвep с установленным на нем РНР. В следующей главе мы расскажем о том, как можно установить персональный Web-сервер, установить на нем РНР и сконфигурировать его.
УСТАНОВКА WEB-CEPBEPA И РНР
- Что такое web-cepвep
- Становимся администратором персонального сервера
- Устанавливаем персональный web-cepвep
- Настраиваем сервер
- Устанавливаем РНР
- Регистрируем РНР в windows
- Проверяем работу РНР
Установка web-сервера и РНР
Чтобы облегчить себе задачу по изучению языка РНР и начать создавать собственные РНР сценарии, установим на свой компьютер web-cepвep. Персональный web-cepвep входит в комплект Windows, поэтому нам далеко ходить не надо. Не будем останавливаться на вопросах установки web-cepвepa. Каждый может выбрать тот сервер какой ему больше понравится, какой наиболее всего удовлетворяет его требованиям и подходит к той операционной системе, которая используется на его компьютере. После установки сервера следует запомнить те каталоги, к которым открыт доступ серверу.
Существуют различные реализации интерпретатора РНР для разных платформ. Дистрибутивы распространяются бесплатно, их можно найти в Интернете по адресу http://www.php.net/downloads.php. Для того, чтобы установить РНР на компьютер, необходимо получить дистрибутив (например, из Интернета), распаковать его в пользователем выбранный директорий. Пусть устанавливается версия РНР для Windows, в этом случае важно иметь в виду, что она будет работать с такими серверами, как Personal Web Server, Internet Information Server, Apache 1.3.x Omni
HTTPd 2.b1. После того, как файлы распакованы, находим файл php3-dist.ini и копируем его в тот каталог, где расположен Windows, предположим, в каталог Windows, при этом меняем имя файла на php.ini. После этого необходимо внести изменения в сам файл php.ini. Главное, что здесь будет необходимо сделать — это указать путь к файлам РНР. Остальные установки следует сделать такими, чтобы они максимально соответствовали вашим требованиям. Более подробно директивы файла php.ini мы рассмотрим далее в этой главе.
Затем переходим к ответственной части редактирования регистра Windows. Сделаем это с помощью системной утилиты Regedit.
Запускаем Regedit (Пуск Выполнить вводим «regedit») и находим HKEY_LOCAL_MACHINE (см. рис. 2.1).
В правой панели редактора реестра переходим к /System/CurrentControlSet/Services/W3Svc /Parameters/ScriptMap.
Находим пункт Правка → Создать → Строковой параметр (New → (строковое значение) Value). Здесь мы задаем расширение, которое будет использовано для файлов, содержащих сценарии РНР, например, расширение .php или .phtm (рис. 2.2).
После того, как тип файлов задан, щелкаем двойным щелчком мыши на вновь созданном параметре .php, появляется диалоговое окно свойств этого параметра, в котором мы указываем полный путь к библиотеке для обработки файлов данного типа. Иными словами, мы указываем полный путь к месту расположения рабочих файлов РНР в нашей системе (рис. 2.3).
Определите расширение, которое вы хотите использовать для ваших сценариев РНР (например, .php3).
Если мы используем несколько различных расширений для РНР- файлов, то путь к файлам, используемым для обработки РНР-сценариев, необходимо указать для каждого расширения (рис 2.4).
Следующим шагом находим HKEY_CLASSES_ROOT, выбираем пункт меню Правка → Создать → Раздел (New → Key). Определим ключ для заданного выше расширения (например, .phtm) в виде .phtm. В правой панели окна дважды щелкнем «параметр по умолчанию» и введем значение в виде «phpfile» (рис. 2.5).
Такие действия следует произвести для каждого установленного расширения.
Затем создаем новый раздел в HKEY_CLASSES_ROOT — раздел phpfile. Выбираем вновь созданный раздел phpfile и в правой части диалогового окна дважды щелкаем на «по умолчанию» ( «default value»), в появившемся окне вводим значение РНР Script (рис. 2.6).
В левой панели окна вызовем контекстное меню при выбранном разделе phpfile, для этого щелкнем правой кнопкой мыши на phpfile. В появившемся меню выберем Создать → Раздел. Назовем раздел Shell. Повторим операцию, выберем раздел Shell, щелкнем правой кнопкой мыши, в контекстном меню выберем Создать → Раздел, зададим имя open. И еще раз повторим операцию, вызовем контекстное меню правым щелчком мыши при выбранном разделе open, выберем пункт Создать →Раздел, назовем раздел command.
Выделяем раздел command, в правой части окна дважды щелкаем на «значение по умолчанию», в появившемся окне вводим путь к файлу php.exe. Например: D:\Program Files\php\php.exe -q %1 (рис. 2.7).
Сейчас мы можем покинуть программу Regedit
.
Конфигурирование РНР
Важная информация о конфигурации РНР хранится в файле php.ini (или php3.ini для версии php3), о котором мы уже упоминали выше. Обращение к файлу php.ini происходит один раз при запуске сервера. В варианте CGI обращение к этому файлу будет осуществляться всякий раз при обращении к модулю php.exe. Для правильной работы РНР важно не пожалеть времени и усилий для того, чтобы наиболее оптимальным образом сконфигурировать файл php.ini. В этом файле содержится большое количество команд-директив, от них зависит способ работы php, а соответственно, и получаемый результат. Рассмотрим назначение отдельных команд файла php.ini подробнее.
Основные команды в файле php.ini
asp_Jags (логическое значение)
Позволяет использование обрамляющих PHP-скрипт символов в виде <% %>, т.е. символов ASP-скриптов в дополнение к основным обозначениям начала и конца РНР-скрипта (<? и ?>).
auto_append_file — строковое значение
Определяет имя файла, который автоматически добавляется к основному файлу с осуществлением его проверки. Файл включается так же, как если бы была вызвана функция include(), при этом используется значение include_path.
Специальное значение попе запрещает автодобавление.
auto_prepend_file — строковое значение
Определяет имя файла, который автоматически добавляется к основному файлу и проверяется, вставка происходит перед основным файлом. Файл включается так же, как если бы была вызвана функция include(), с использованием include_path. Специальное значение попе запрещает автодобавление.
display_errors (логическое значение)
Этот параметр определяет, будут ли сообщения об ошибках выводиться как часть HTML-кода.
doc_root (строковое значение)
Основной каталог («root directory») РНР на сервере. Используется только когда указанный каталог не пуст. Если РНР сконфигурирован при помощи safe mode, то никакие другие файлы за пределами этого каталога не будут обрабатываться с применением РНР.
error_log (строковое значение)
Имя файла, в котором хранится журнал log file. Если используется специальное значение syslog, то содержимое отправляется в системный журнал system logger.
error_reporting (целое значение)
Флаг уровня сообщений об ошибках. Значения флагов приведены в табл. 2.1. Параметр устанавливает уровень сообщений об ошибках. Чтобы установить уровни сообщений об ошибках, выберите те сообщения, которые вам необходимы, сложите соответствующие им значения, результат укажите в поле error_reporting.
Значение по умолчанию — 7 (показываются обычные ошибки, обычные предупреждения и синтаксические ошибки).
open_basedir (строковое значение)
Задает директорий, в котором могут находиться PHP-файлы, доступные для обработки. Когда сценарий пытается открыть файл с помощью, например, fopen или gzopen, то осуществляется проверка наличия такого файла. Если файл находится за пределами указанного директория, то РНР откажется открыть его. Имена директориев в списке можно отделять друг от друга точками с запятой (в системе Windows).
Специальное значение . показывает, что каталог, в котором находится сценарий, используется в качестве основного каталога. По умолчанию открыт доступ ко всем файлам.
gpc_order (строковое значение)
Устанавливает порядок обработки методов GET/POST/COOKIE. По умолчанию устанавливается «GPC». Если установить «GP», то РНР будет полностью игнорировать cookies и к тому же перезапишет все переменные метода GET переменными метода POST с теми же именами.
ignore_user_abort (строковое значение)
По умолчанию «Оn». Если указано «Off», то выполнение скриптов будет прекращено, если вывод информации скриптами был осуществлен после того, как клиент прекратил связь.
include_path (строковое значение)
Определяет список каталогов где будут располагаться файлы для функций requireQ, includeQ и fopen_with_path(). В этих каталогах будет осуществлен поиск запрашиваемых файлов. Например,
include_path=".;с:\www\phplib".
Значением по умолчанию является «.» (текущий каталог).
log_errors (логическое значение)
Сообщает, что независимые сообщения об ошибке сценария должны регистрироваться в журнале ошибок сервера.
magic_quotes_gpc (логическое значение)
Устанавливает magic_quotes состояние для GPC (Get/Post/Cookie) операций. Когда magic_quotes включено (on), все одиночные кавычки ', двойные кавычки «, обратные косые черты \ и нулевые значения (NUL's) записываются с обратной косой чертой автоматически. Если также включено magic_quotes_sybase, то одиночная кавычка записывается с добавлением дополнительной одиночной кавычкой вместо обратной косой черты.
magic_quotes_runtime (логическое значение)
Если magic_quotes_runtime разрешено, то большинство функций, которые возвращают данные внешнего источника, включая базы данных и текстовые файлы, будут иметь кавычки, записанные в сочетании с обратной косой чертой. Если magic_quotes_sybage включены, то одиночная кавычка записывается с добавлением дополнительной одиночной кавычкой вместо обратной косой черты.
magic_quotes_sybase (логическое значение)
Если включен magic_quotes_sybase, то одиночная кавычка записывается с добавлением дополнительной одиночной кавычкой вместо обратной косой черты, однако в том случае, если включены magic_quotes_gpc или magic_quotes_runtime.
max_execution_time (целое значение)
Эта установка определяет максимальное время в секундах, которое отводится для выполнения сценария, прежде чем выполнение будет прекращено анализатором. Это помогает осуществить защиту от некорректно написанных сценариев.
memory_limit (целое значение)
Эта установка определяет максимальный размер памяти в байтах, отводимый для сценария. Параметр помогает запретить некорректно написанным сценариям использовать всю доступную память сервера.
short_open_tag (логическое значение)
Задает допустимость использования короткой формы ( <? ?> ярлыков РНР. Если вы хотите использовать РНР совместно с XML, то эту опцию необходимо отключить. Если опция отключена, следует использовать длинную форму тегов ( <?php ?> ).
track_errors (логическое значение)
Если опция включена, то последнее сообщение об ошибке всегда будет представлено в содержимом глобальной переменной $php_errormsg.
track_vars (логическое значение)
Если эта опция включена, то входящая информация GET, POST и cookie может быть найдена в глобальных массивах $HTTP_GET_VARS, $HTTP_POST_VARS и $HTTP_COOKIE_VARS, соответственно.
upload_tmp_dir (строковое значение)
Временный каталог, используемый для хранения файлов при их загрузке на сервер. Запись в этот каталог должна быть разрешена всем, независимо от того, какой пользователь обращается к РНР.
user_dir (строковое значение)
Основное имя каталога, используемого в домашнем каталоге пользователей для файлов РНР, например, public_html.
Конфигурирование почты
SMTP (строковое значение)
Имя DNS или IP-адрес почтового сервера SMTP, который должен
использоваться РНР (в системе Windows) для отправки почтового сообщения функцией mailQ.
sendmail_from (строковое значение)
Определяет значение поля «From:» — почтовый адрес, который указывается в сообщении, отправляемом РНР (в Windows).
sendmail_path (строковое значение)
Задает местоположение программы не компьютере sendmail, как правило, это /usr/sbin/sendmail или /usr/lib/sendmail.
Конфигурирование безопасной настройки (Safe Mode)
safejnode (логическое значение)
Устанавливает режим (включен, выключен) безопасной работы РНР (safe mode).
safe_mode_exec_dir (строковое значение)
Если РНР работает в безопасном режиме (в режиме safe mode), то system() и другие функции обращения к системным программам не будут работать с теми программам, которые находятся в каталоге, отличающемся от указанного в качестве значения параметра safe_mode_exec_ dir.
Конфигурирование отладчика
debugger.host (строковое значение)
Имя DNS или IP-адрес хоста, используемого отладчиком.
debugger.port (строковое значение)
Номер порта, используемого отладчиком.
debugger.enabled (логическое значение)
Задает возможность (отладчик включен, выключен) использования отладчика
Конфигурирование загрузки расширений (Extension Loading)
enable_dl (логическое значение)
Эта опция полезна только в модуле РНР для сервера Apache. Опция может разрешать/запрещать динамическую загрузку расширений РНР функцией dl() для каталогов и/или для виртуальных серверов. Отключение динамической загрузки может быть использовано в целях безопасности. При включенной динамической загрузке можно обойти ограничения, установленные при помощи safe_mode и open_basedir. По умолчанию динамическая загрузка разрешена за исключением случаев, когда включен безопасный режим safe-mode. При включенном безопасном режиме safe-mode использование dl() недопустимо.
extension dir (строковое значение)
Задает каталог, в котором находятся динамически загружаемые расширения.
extension (строковое значение)
Строка, задающая имена динамически загружаемых расширенных при
запуске РНР-расширений.
Конфигурирование MySQL
mysql. allow_persistent (логическое значение)
Разрешает/запрещает постоянные MySQL-соединения.
mysql. max_persistent (целое значение)
Максимальное число постоянных MySQL-соединений в одном процессе.
mysql.maxjinks (целое значение)
Общее максимальное число MySQL-соединений в одном процессе, включая постоянные соединения.
Конфигурирование mSQL
msql. allow_persistent (логическое значение)
Разрешить/запретить постоянные mSQL-соединения. ,
msql. max jjersistent (целое значение)
Максимальное число постоянных соединений
mSQL в одном процес< msql.maxjinks (целое значение)
Общее максимальное число mSQL-соединений в одном процессе, включая постоянные соединения.
Конфигурирование Postgres
pgsql.allowjjersistent (логическое значение)
Разрешить/запретить постоянные соединения Postgres.
pgsql.maxjjersistent (целое значение)
Максимальное число постоянных соединений Postgres в одном процессе
pgsql. max Jinks (целое значение)
Общее максимальное число Postgres-соединений в одном процессе, включая постоянные соединения.
Конфигурирование Sybase
sybase. allowjjersistent (логическое значение)
Запретить/разрешить постоянные Sybase-соединения.
sybase.maxjjersistent (целое значение)
Максимальное число постоянных Sybase-соединений в одном процессе.
sybase.max Jinks (целое значение)
Общее максимальное число Sybase-соединений в одном процессе, включая постоянные соединения.
Конфигурирование Sybase-CT
sybct.allowjjersistent (логическое значение)
Разрешить/запретить постоянные Sybase-CT-соединения, По умолчанию разрешено.
sybct.max_persistent (целое значение)
Максимальное число постоянных Sybase-CT-соединений в одном процессе. По умолчанию значение — 1, означающее неограниченное число постоянных соединений.
sybct.maxjinks (целое значение)
Общее максимальное число Sybase-CT-соединений в одном процессе, включая постоянные соединения. По умолчанию значение —1, означающее неограниченное число соединений.
sybctJoginJimeout (целое значение)
Максимальное время (в секундах), отведенное для ожидания повторной попытки соединения, после чего будет произведен отказ. По умолчанию — одна минута.
sybct.timeout (целое значение)
Максимальное время (в секундах), отведенное для ожидания окончания выполнения select_db или выполнения запроса. По умолчанию — не ограничено.
sybct. hostname (строковое значение)
Имя хоста, с которым осуеществляется соединение (для показа sp_who). По умолчанию — попе (отсутствует).
Конфигурирование ВС Math
bcmath. scale (целое значение)
Количество десятичных цифр, используемых во всех функциях bcmath.
Конфигурирование возможностей броузера
browscap (строковое значение)
Имя файла, содержащего установки броузера.
Конфигурирование ODBC
uodbc.default_db (строковое значение)
База данных ODBC, использующая по умолчанию в функциях odbc_connect() и odbc_pconnect().
uodbc.default_user (строковое значение)
Имя пользователя, используемое по умолчанию в функциях, если в odbc_connect() и odbc_pconnect().
uodbc.defaultjjw (строковое значение)
Пароль, используемый по умолчанию в функциях odbc_connect() и odbc_pconnect().
uodbc.allowjjersistent (логическое значение)
Разрешить/запретить постоянные ODBC-соединения.
uodbc.maxjjersistent (целое значение)
Максимальное число постоянных ODBC-соединений в одном процессе.
uodbc. max Jinks (целое значение)
Общее максимальное число ODBC-соединений в одном процессе, включая постоянные соединения.
Проверяем работоспособность сервера
Прежде чем написать нашу первую PHP-программу, способную работать в качестве средства обработки клиентских запросов, проверим работоспособность персонального web-cepвepa. Как мы уже говорили ранее, допускается использование и других типов серверов, но волей случая мы остановились именно на этом сервере. Программа-сервер используется для обработки клиентских запросов, т.е. запросов, поступающих от программы-клиента, как правило, программой-клиентом является программа-броузер, например, Netscape Navigator, Opera, Internet Explorer. Клиент отправляет запрос серверу, в запросе указывается имя файла, требуемого клиентом. Сервер находит запрашиваемый файл. В нашем случае персональный web-cepвep после получения запроса и нахождения соответствующего файла распознает по расширению этого файла тип его содержимого. В качестве статических HTML-файлов будут использованы файлы с расширениями .html и .htm. Эти файлы будут переданы клиенту с использованием протокола http, причем файлы будут переданы в том виде, в каком они хранятся на диске компьютера без внесения каких-либо изменений перед отправкой.
При установке РНР на компьютер с программой-сервером мы вносили изменения в системный регистр. Мы указали типы файлов, которые будут использоваться в качестве источников, содержащих РНР- коды. С такими PHP-файлами мы связали расширения .php и .phtml. Можно задать и другие типы файлов в качестве файлов, содержание которых будет проверено и обработано интерпретатором РНР перед отправкой клиенту. В нашем случае все файлы, с расширениями .phtml и .php, если их запрашивает программа-клиент при обращении к программе-серверу, в отличие от HTML-файлов (расширения .htm и .html), будут найдены сервером на диске. Затем, если запрошенный файл существует, то он будет проверен интерпретатором РНР, в случае отсутствия ошибок (все PHP-программы следует проверить и отладить перед тем, как они будут размещены на сервере) PHP-программа будет выполнена и отправлен html-ответ клиенту в соответствии с содержимым запрошенного клиентом PHP-файла. При выполнении РНР-программы сервер и интерпретатор РНР могут не только генерировать ответный HTML-код, используя ресурс сервера, но выполнять дополнительные действия. Что именно позволяет делать РНР нам станет известно в подробностях после того, как мы поближе познакомимся с возможностями этого языка. А сейчас мы просто напишем простейшую PHP-программу, проверим ее, исправим ошибки, разместим на сервере. После этого мы запросим файл с написанной программой из программы-броузера (она может располагаться на том же компьютере, что и сервер), и убедимся в том, что наша программа вполне работоспособна и полученный с ее помощью простейший HTML-код будет представлен в обычном для броузера виде.
Первый шаг — убеждаемся в том, что сервер запущен. В меню Пуск → Программы находим пункт Microsoft Personal Web Server находим Личный диспетчер Web и вызываем его. Перед нами открывается диалоговое окно (рис. 2.8).
Необходимо убедиться в том, что сервер запущен. Если сервер запущен, то в главном окне Личный диспетчер Web присутствует кнопка «Стоп». Если сервер находится в выключенном состоянии, то в окне будет показана кнопка «Пуск» (рис. 2.9). В этом случае необходимо нажать эту кнопку для того, чтобы каталоги сервера стали доступны для общего доступа.
Следующим нашим шагом будет определение имен каталогов, в которых будут расположены файлы нашего сайта на том компьютере, где расположена программа-сервер. Выберем в меню, которое расположено в левой части окна Личный диспетчер Web, последнюю опцию, озаглавленную словом «Другие», щелкнем ее, и перед нами появится окно, в котором будут отображены дополнительные параметры (рис. 2.10).
В этом окне мы можем указать имена документов, которые будут открываться по умолчанию, а также разрешить просмотр каталогов сервера и установить режим сохранения журнала активности узла. Но больше всего нас интересуют сами каталоги, в которых мы будем размещать PHP-программы, а точнее, .php-файлы, в которых используются РНР-скрипты.
В представленном окне (рис. 2.10) перед нами показано дерево виртуальных каталогов сервера. Имена папок здесь являются псевдонимами реальных физических папок, расположенных на жестком диске компьютера. Виртуальные имена используются для того, чтобы скрыть от клиента реальное местоположение файлов на диске сервера. Это увеличивает безопасность, степень защищенности сервера.
Чтобы узнать реальное имя, скрытое за псевдонимом, выберем интересующую нас виртуальную папку, выделим ее и нажмем кнопку «Изменить свойства». Если мы выбрали папку cgi-bin, и нажали «Изменить свойства», то перед нами откроется окно, в котором будет содержаться информация о реальном имени каталога, соответствующего виртуальному имени каталога сервера cgi-bin, а именно, мы узнаем, что этому каталогу в действительности соответствует каталог
D-\Inetpub\wwwroot нашего компьютера (рис. 2.11). Здесь мы имеем возможность только получить информацию о том, какой реальный каталог соответствует указанному виртуальному каталогу сервера, но и изменить значение имени реального каталога, соответсвующего выбранному псевдониму. Мы также можем задать уровень доступа к каталогу, поставив галочки в полях чтение, выполнение, сценарии.
Из главного окна управления персональным сервером (рис. 2.8) мы знаем также, что адрес нашего сервера выглядит в локальной сети (в случае отдельной рабочей станции такой сетью можно считать «тривиальную» сеть, состоящую из этого отдельно стоящего, носимого или перевозимого в случае palmtop и/или notebook компьютера) как http://mycomp. Если мы соединяемся с Интернет посредством модема с помощью удаленного доступа к сети, то запущенный персональный web-cepвep будет доступен для любого пользователя Интернет, поскольку в момент соединения с сетью Интернет провайдера автоматически выделяет нам индивидуальный IP-адрес. Каждый раз при соединении с Интернет при помощи модема мы получаем такой адрес, причем этот адрес может изменяться раз от раза. Некоторые провайдеры услуг Интернет предоставляют возможность закрепления фиксированного IP-адреса за пользователем.
Если выделенный при соединении с Интернетом наш IP-адрес будет известен другим пользователям сети Интернет, то они смогут посетить наш домашний персональный web-cepвep. Как узнать то, какой именно IP-адрес был выделен для нас на время текущего сеанса? Для этого существует утилита winipcfg, вызвать которую можно, например, из DOS, для чего в командной строке DOS следует набрать
Winipcfg
Перед нами появится окно, в котором содержится вся интересующая нас информация (рис 2.12). Если соединение с Интернет не установлено, то эта информация не будет слишком полезной.
При наличии соединения с сетью Интернет мы сможем получить интересующую нас информацию (рис. 2.13).
Сейчас доступ к нашему серверу открыт для любого пользователя Интернет. Для этого необходимо лишь указать адрес и протокол в броузере пользователя в виде http://212.46.201.243. При этом броузер обратится к нашему серверу и загрузит ту страницу, которая установлена для загрузки по умолчанию. В случае отсутствия соединения с Интернет мы имеем возможность проверить работоспособность установленного и настроенного сервера, если укажем в броузере адрес http://mycomp. Если при этом появится приветственная страница персонального сервера (рис. 2.14), то сервер настроен и работает правильно.
Если сервер не включен, неправильно настроен или отсутствует, то появится страница, содержащая предупреждение о том, что страница недоступна (рис. 2.15). При правильно настроенном и работающем сервере может появиться и другая страница, отличающаяся от той, что приведена на рис. 2.14. Приведенная на этом рисунке страница выводится по умолчанию при установке персонального сервера, но она может быть изменена, заменена, или сервер может быть сконфигурирован для показа . иной странички. Все зависит от администратора сервера, т.е. от нас, ибо мы являемся администраторами своего персонального сервера. В случае только что установленного сервера приведенная выше страница направляется программе-клиенту вследствие работы скрипта default.asp.
Итак, мы убедились в том, что сервер функционирует нормально.
Создаем простейший PHP-сценарий и размещаем его на сервере
Как мы уже знаем, PHP-сценарий помещается между знаками <?php и ?> и вставляется в обычную HTML-страницу. Существенным является то, что обычная HTML-страница может быть расположена где угодно, в то время как страница, содержащая PHP-сценарий должна располагаться в каталоге, доступном серверу (или, для краткости, на сервере) и иметь расширение, по которому система узнает, что данный файл долен быть обработан интерпретатором РНР.
Создаем файл first.phtm, текст файла таков:
<html>
<head>
<title>Первый простейший PHP-сценарий. </title>
</head>
<body>
<P align="center">
В этом файле содержится PHP-сценарий, выполняемый на сервере.
<Р>
<?php
echo ("<Р>Этот текст выведен при помощи <BR><font size=+l>
<b>PHP.</b><font><p>удачная попытка!"); ?>
<body>
</html>
Для создания этого файла мы используем простейший редактор текстов, такой, как например, блокнот в системе Windows, или edit.exe в DOS. Необходимо позаботиться о том, чтобы сохраняемый текст не содержал никакой дополнительной информации, в том числе информации о форматировании текста. Файл frirst.phtm следует запомнить в основном каталоге персонального сервера, в нашем случае, в каталоге d:\inetpub\wwwroot. Из программы-броузера следует запросить файл http://mycomp/first.phtm. В ответ мы получим страницу, показанную на рис. 2.16.
Полученный броузером от сервера HTML-код этой страницы выглядит следующим образом:
<html>
<head>
<title>Первым простейший PHP-сценарий. </title>
</head>
<body>
<P align="center">B этом файле содержится PHP-сценарий, выполняемый
на сервере.
<р>
<Р>Этот текст выведен при помощи <BR> <font size=+l><b>PHP. </Ь></
font><p>Удачная попытка!<body>
</html>
Если поместить файл first.phtm в другой каталог, который не обслуживается сервером, то броузер воспримет файл first.phtm как неизвестный ему тип файлов и предложит сохранить его (рис. 2.17).
В этой главе мы научились создавать простейшие РНР-сценарии, размещать страницы, содержащие такие сценарии, на сервере, и проверять их работоспособность. В последующих главах мы рассмотрим возможности, предоставляемые РНР, более подробно.
ПЕРВЫЕ ПРОГРАММЫ НА РНР
- Отладка программ
- Формы
- Имена и значения
- Передача пар имя/значение из формы программе РНР
- Обработка значений
- Программа РНР-почта
Первые программы на РНР
Сейчас мы уже можем писать свои первые программы на языке РНР, не отвлекаясь на то, как и где они будут работать. Этим вопросам были посвящены предыдущие главы. Мы знаем, как в целом должна выглядеть программа на РНР, как она может быть вставлена в HTML- код исходного phtm-файла.
Начнем с простого примера, в котором язык РНР используется для того, чтобы в отсылаемый броузеру код вставить заранее подготовленный файл целиком. При этом в нашем phtm-файле появится лишь одна совсем маленькая инструкция include(«footer.txt»).
Этого достаточно. Файл footer.txt будет вставлен в том месте HTML- кода, где находится функция include(«footer.txt») (рис. 3.1).
Удобство состоит в том, что вызываемый файл будет содержать лишь незначительно больший объем информации, в то время как размер вставляемого файла может быть сколь угодно большим.
Вот текст файла со вставкой (3-l.phtm):
<html> <head>
<title>Bставка файла. </title>
</head>
<body>
<P align="center">Этот файл используется для проверки возможности вставки другого файла целиком.<р>
<?php include("footer.txt");
?>
<body>
</html>
При получении броузером этот файл будет изменен. То, что получит броузер, не будет содержать фрагмента, обрамленного символами <?php и ?>, вместо этого фрагмента будет помещено содержимое файла footer.txt.
Функция include(), с помощью которой осуществляется вставка файлов в исходный HTML-код, может оказаться полезной в том случае, когда существует необходимость скрыть от пользователя структуру сайта. Иными словами, используя функцию include(), можно скрыть от пользователя то, в каком виртуальном каталоге сервера находится загружаемый файл, так как имя этого файла указано в виде аргумента функции include(). Когда броузер запросит файл, в котором содержится include(), то он в ответ получит только содержимое файла, указанного в качестве аргумента include(), при этом пользователь, управляющий броузером, не будет знать не только имя файла, являющегося аргументом include(), но он даже ничего не будет знать о том, как сформировано содержимое полученное его броузером, он не узнает, что фрагмент его HTML-кода был создан с использованием функции include().
Вывод запрашиваемого файла
Поскольку РНР является языком программирования, предоставляющим весьма широкие возможности, то можно по-разному организовать отправку клиенту различных файлов в зависимости от того или иного параметра. Так, вместо явно указанного имени вставляемого файла в функции include() можно указать переменную тип строки, которая будет содержать значение, равное имени файла. При этом значение это можно изменить в программе в зависимости от любых условий. Иными словами, запрашиваемая пользователем страница будет выглядеть по-разному в зависимости от этих условий, так как пользователю будут посылаться различные фрагменты HTML-кода.
Чтобы проиллюстрировать это на простом примере, создадим файл 3-2.phtm в следующем виде:
<html>
<head>
<title>Bставка файла в зависимости от условий.</title>
</head>
<body>
<Р align="center"> Последущий фрагмент будет вставлен в зависимости от условий.<HR><p>
<?php
$а="3-1.txt";
if(1>0)$а="3-2.txt";
include($а);
?>
<body>
</html>
Здесь аргументом функции include() является переменная. Значение переменной может быть изменено. Для работы программы могут понадобиться два файла: 3-l.txt и 3-2.txt. Создадим их, пусть они будут весьма простыми. Файл 3-l.txt:
<font color="red" size=+2>
Этот фрагмент вставлен из файла 3-l.txt
</font>
Файл 3-2.txt:
<font color="green" size=+2>
Этот фрагмент вставлен из файла 3-2.txt
</font>
После запроса файла 3-2.phtm броузер получит следующий HTML-текст:
<html> <head>
<title>BcTaBKa файла в зависимости от условий.</title>
</head>
<body>
<Р align="center"> Последующий фрагмент будет вставлен в зависимости от условий.<HR><p> <font color="green" size=+2>
Этот фрагмент вставлен из файла 3-2.txt
</font>
<body>
</html>
Как видим, здесь нет никакого намека на то, как был построен этот файл. Ссылка на функцию include() отсутствует вовсе. Вид окна броузера показан на рис. 3.2.
Понятно, что если воспользоваться возможностями обработки полученной на сервере пользовательской информации, т.е. информации, полученной от программы-клиента, то можно организовать вывод файлов в зависимости от этой информации. Но как получить информацию от пользователя?
Существует очень удобный механизм передачи информации от броузера серверу. Специально для того, чтобы передача такой информации могла быть осуществлена с максимальным удобством, были изобретены формы.
Формы и передача информации клиентом серверу
Формы могут быть созданы исключительно средствами HTML. Для создания формы используется ярлык <form>. Внутри формы могут быть расположены элементы, причем количество элементов может быть велико. По своему названию и сути формы, как правило, содержат в себе элементы управления (текстовые поля, поля для галочек, радиокнопки, кнопки), которые предоставляют пользователю осуществлять тот или иной выбор. Конечно, не только стандартные средства сбора пользовательской информации могут быть использованы при работе с формами. Используя языки программирования, например, JavaScript, пользовательская информация может быть получена от пользователя и без ведома пользователя. Однако, сейчас мы не будем останавливаться на этом. Нас будет интересовать вопрос того, как информация от пользователя может быть передана серверу с использованием стандартных возможностей форм.
Рассмотрим пример, содержащий форму. Напишем простой HTML- файл и сохраним его на сервере с именем 3-3.htm:
<html>
<head>
<title>
Пример формы. Передаем пользовательскую информацию серверу.
</title>
<body>
<form name="first" method=post action="3-3.phtm">
<Р>Введите текстовую информацию: <input type="text" name="text1">
<P><input type="submit" value="Кнопка отправки формы">
</form>
</body>
</html>
Здесь мы используем элемент формы, который описан при помощи ярлыка <form>. Мы присвоили форме имя, указав атрибут паше и задав его значение (строка first). Важными атрибутами являются атрибуты method (значение post) и action. Значением атрибута action является имя файла, содержащего программу, которая будет обрабатывать полученную информацию. В нашем случае — это файл 3-3.php. Его созданием мы займемся минутой позже.
Наша форма состоит из двух стандартных элементов управления: текстового поля и кнопки для отправки формы. В HTML все стандартные элементы управления для работы с формами описываются при помощи ярлыка <input>, а все многообразие (порядка десяти) элементов управления обязано существованию различных стандартных типов элементов input. Чтобы создать нужный элемент управления, необходимо указать соответствующий тип элемента управления, присвоив необходимое значение атрибуту type. Существуют следующие стандартные типы элементов управления, используемые в формах:
Button
Checkbox
file
hidden
Image
password
Radio
reset
submit
Text
Перечислим применение типов элементов управления:
<INPUT type=button> создает элемент управления — кнопку.
Когда задан и включен элемент <INPUT type=checkbox>, то форма FORM посылает пару имя/значение (name/value). По умолчанию элемент INPUT type=checkbox включен.
<INPUT type=file> создает объект, отправляющий серверу файл, в документе показывается окно для ввода текста и кнопка Browse.
INPUT type=file должен быть использован в элементе FORM.
INPUT type=file необходимо указать значение NAME. Значение атрибута METHOD в элементе FORM должно быть указано как post. Значение атрибута ENCTYPE в элементе FORM должно быть указано как multipart/form-data. Для того, чтобы файл мог быть получен серверной стороной, необходимо, чтобы процесс на серверной стороне поддерживал посылаемые ему отправления а форме multipart/form-data. Например, Microsoft Posting Acceptor позволяет серверу Microsoft Internet Information Server (IIS) получать файлы указанным выше способом.
<INPUT type=hidden>. Этот тип не предоставляет пользователю никаких элементов управления, а посылает значение свойства value вместе с посылаемой формой.
<INPUT type=image> создает элемент управления — рисунок, при щелчке на котором происходит немедленная отправка формы серверу.
<INPUT type=password> создает поля для ввода однострочного текста, вводимый текст не показывается пользователю.
<INPUT type=radio> создает элемент управления — радиокнопку. Радиокнопки используются для ограничения пользовательского выбора, пользователь имеет возможность выбрать лишь один вариант из нескольких. Для этого несколько кнопок объединяются в группу, все кнопки в одной группе имеют одно и то же имя name. При посылке формы выбранная кнопка создает пару name/value.
Для отметки выбранной кнопки по умолчанию используется свойство checked, которому присваивается значение true.
<INPUT type=reset> создает кнопку, которая, будучи нажата, восстанавливает значения элементов управления формы и возвращает их к своим первоначальным значениям. Свойство value содержит метку, показываемую на кнопке Reset, точно также, как это происходит в случае с обычной кнопкой INPUT.
<INPUT type=submit> создает кнопку, которая при нажатии производит отправку формы серверу. Используется атрибут VALUE для создания кнопки с надписью-меткой, заданной в этом атрибуте. По умолчанию используется надпись Submit Query. Если пользователь нажимает кнопку Submit и посылает форму, а кнопка имеет имя name а, то с посылаемыми данными отправляется пара имя/значение (name/value).
<INPUT type=text> создает элемент управления для ввода однострочного текста. Атрибут SIZE задает количество видимых текстовых знаков в поле для ввода в элементе INPUT type=text. Атрибут MAXLENGTH задает максимальное количество знаков, которые могут быть введены в поле для ввода текста.
Помимо типа элемента управления, элемент input может иметь и другие атрибуты. Наиболее важными для нас являются два атрибута. Первый — это имя элемента, значение атрибута name, а второй — значение элемента управления. Значением элемента управления является значение атрибута value. В случае текстового поля значение элемента управления соответствует содержимому текстового поля, т.е. равно строчному значению, совпадающему с текстом, введенным в текстовый элемент управления. В соответствии с общепринятыми правилами, клиент после нажатия кнопки отправки формы (элемент управления <input type=submit>) пересылает указанной в атрибуте action текущего элемента form пары имя|значение, name|value. Существует два метода отправки этих значений: метод post и метод det. При использовании метода get пары name|value отправляются в виде пар, присоединенных к запрашиваемому URL-адресу, располагая их в конце строки после знака вопроса.
Одним из преимуществ языка РНР в сравнении с другими средствами обработки форм на серверной стороне, является то, что значения name/value могут быть получены очень просто. Для этого мы укажем в качестве метода отправки формы метод post, а в РНР- программе, расположенной в том файле, что указан в качестве значения атрибута action, будем использовать переменную с именем паше. Идентификатор имени в программе РНР будет совпадать с именем, указанным в элементе управления формы. Значение этой переменной будет совпадать со значением формы. В нашем случае имя элемента формы было указано в виде name1, соответствующая переменная в РНР (файл 3-3.phtm) будет иметь вид $hamel. (Помните, что в РНР переменные начинаются со знака доллара $).
Сейчас мы уже вполне готовы к тому, чтобы написать текст файла
3-3.phtm. Вот он:
<html>
<head>
<title>
Пример обработки формы.
</title>
<body>
<Р> Ваша форма обработана.
<Р> От вас получен следующий текст.
<РХ1>Текст, введенный в текстовом поле формы, таков:</i>
<?php
echo ("<p><font size=+2 color='red'>$textl");
?>
</form>
</body>
</html>
Чтобы полностью убедиться в том, что форма отсылается серверу и обрабатывается в соответствии с нашими инструкциями, загрузим страницу 3-3.htm в броузер и введем в текстовое поле какой-нибудь текст, например, «Зима и солнце — прелесть дня!», так, как это сделано на рис. 3.3.
Сейчас форма готова к отправке на сервер. Чтобы отправить ее, нужно всего лишь нажать кнопку «Кнопка отправки формы». Нажимаем ее, и через несколько секунд в коне броузера мы можем видеть ответ сервера (рис. 3.4). Как видим, форма была успешно обработана.
Вывод файла в зависимости от информации о клиенте
Чтобы завершить наш рассказ о том, как можно вывести тот или иной файл в зависимости от того, что получено от пользователя, вернемся к нашему первому в этой главе примеру (файл 3-2.phtm) и изменим его следующим образом (теперь это будет файл 3-4.phtm):
<html>
<head>
<title>Вставка файла в зависимости от условий.</title>
</head>
<body>
<В align="center"> Последующий фрагмент будет вставлен в зависимости от условий. <HR> <p>
<?php
if ($b=="l")$a="3-l.txt" ;
if ($b=="2")$a="3-2.txt";
include($a);
echo ($b);
?>
<?body>
</html>
В этом файле PHP-скрипт осуществляет вставку одного из двух файлов в зависимости от того, каким будет значение переменной $Ь. Для того, чтобы определить значение этой переменной, мы создадим форму с двумя радиокнопками и одним и тем же именем b в файле 3-4.htm, а обработку формы поручим файлу 3-4.phtm. Вот файл 3-4.htm:
<html>
<head>
<title>
Пример формы. Передаем пользовательскую информацию серверу.
</title>
<body>
<form name="first" method=post action="3-4.phtm">
<Р>Сделайте ваш выбор:
<Р>Выбор 1:<input type="radio" name="b" value="l">
<Р>Выбор 2: <input type="radio" name="b" value="2">
<P><input type="submit" value="Кнопка отправки формы">
</form>
</body>
</html>
В окне броузера этот файл будет показан так же, как на рис 3.5.
Радиокнопки используются для того, чтобы пользователь мог осуществить альтернативный выбор. Лишь один вариант, заданный с использованием радиокнопок, может быть выбран пользователем. Группа радиокнопок состоит из нескольких элементов <input type=radio> с одним и тем же значением атрибута name. Значения атрибута value могут быть различными для разных кнопок. В нашем случае все кнопки имеют имя Ь, но принимают значение либо 1, либо 2.
Если выбрать первую радиокнопку и нажать кнопку отправки формы, то ответ сервера будет такой, как показано на рис. 3.6,
Если пользователь выберет вторую радиокнопку, то ответ сервера будет иным (рис. 3.7).
В заключение этого раздела заметим, что иногда в процессе отладки программ, мы обнаружили такую деталь. Формы и созданные для их обработки скрипты иногда не воспринимают имена элементов формы, если эти имена состоят из одной буквы, например так, как в приведенном выше примере, где использовано имя b и соответствующая ему переменная $b. Если изменить имя, указав его в виде, например, bbb, и использовать соответствующую ему переменную $bbb, то ошибок не возникает. При создании любых программ требуется их отладка. Если возникают те или иные ошибки, то попробуйте что- нибудь изменить в программе, сравнить неработающую деталь программы с аналогичным фрагментом из другой работающей программы. Это поможет исправить возникающие ошибки.
Отправка почты средствами сервера
Можно создать программу, которая будет отправлять почту указанному адресату. Адресат может быть как одним и тем же для всех почтовых отправлений, так и значением строки, содержащей адрес получателя, которое может быть изменено как сервером, так и отправителем формы.
Создадим статический HTML-файл, содержащий форму. В этом файле мы создадим несколько элементов управления для ввода текстовой информации. Первый элемент — текстовое поле, в которое пользователю будет предложено вписать свое имя. Второе поле отведено для ввода адреса электронной почты. Предполагается, что значение этого элемента формы будет обработано на сервере программой, которая отошлет по указанному адресу определенный текст. Содержание текста будет меняться в зависимости от того, какая информация была введена пользователем в форму перед ее отправкой серверу. Наконец, последнее текстовое поле предоставляет пользователю произвести выбор его любимого времени года. Эта информация будет использована сервером при формировании почтового отправления по тому адресу, которое пользователь ввел в поле для ввода электронного адреса. Информация в поле для ввода любимого времени года заносится из списка выбора. Список выбора мы формируем при помощи списка, который создается при помощи ярлыка <select>, которому мы присваиваем имя s. После того, как форма будет отправлена на сервер, ее обработает РНР- скрипт, расположенный в файле mail.php, так как именно этот файл указан в качестве значения в атрибуте action ярлыка <form>.
<HTML>
<HEAD>
<ТITLE>Заполняем форму</ТIТLЕ>
<BODY>
<В>Здесь вы можете указать свой адрес и получить дополнительную
информацию, послав нам форму.</В>
<Р>
<TABLE WIDTH = 400><TR><TD align="left">
<FORM ACTION="mail.php" METHOD="POST" >
Ваше имя :<BR>
<INPUT TYPE="text" NAME="name" SIZE="20" MAXLENGTH=" 30"><P>
Ваш email:<BR>
<INPUT TYPE="text" NAME="email" SIZE="20" MAXLENGTH="30 >
<Р>Ваше любимое время года:
<SELECT NAME="s">
<OPTION value = zima>Зима
<OPTION' value = vesna>Becнa
<OPTION value = leto>ЛeTo
<OPTION value = osen>Oceнь
<OPTION value = zemphira>Земфира
</SELECT><P>
<INPUT TYPE="submit" VALUE="отослать форму">
</FORM>
</TD></TR></TABLE></CENTER>
</BODY>
</HTML>
Итак, мы создали три элемента формы, каждый элемент имеет свое индивидуальное имя, которому в программе РНР будет соответствовать своя переменная, эта переменная отличается от имени элемента управления одним символом. В PHP-программе переменные отличаются от имен элементов переданной ей форме наличием символа доллара ($). Вот эти три элемента (табл. 3.1).
Перечисленные в табл. 3.1 переменные ($name, $email, $s) будут доступны PHP-программе в файле mail.php. Создадим этот файл в следующем виде:
<?php
/* Скрипт для обработки переменных, посланных в форме, описанной в файле mail.htm */ echo ("<В>");
echo ("Привет,<hl><center> $name!</center></hl>" ) ;
echo ("<HR></b>") ;
echo ("<center>Cпасибо за участие ! <BR><BR>") ;
echo ("Мы посылаем информацию по указанному Вами адресу: $email <BR><BR>
Ваше любимое время года $s.");
echo ("<hr>");
mail($email, "Ваш запрос", "$name
Спасибо за отклик!n
Мы делаем много полезного и забавного!
Приходите к нам развлечься и заработать, мы тоже любим
$s !");
mail("your@address.ru",
"Запрос информации от пользователя.",
"$name requested for information.n
Адрес пользователя $email. n
Любимое время года пользователя $s.");
?>
Здесь используется функция mail(), первый аргумент функции — адрес, по которому отправляется почтовое сообщение, второй аргумент— тема сообщения, третий аргумент — текст сообщения. Программа посылает два сообщения. Первое сообщение отправляется по адресу, указанному пользователем в форме, а второе сообщение посылается по указанному в PHP-программе адресу, в этом сообщении по заданному адресу пересылается сообщение о том, что пользователь произвел отправку формы, а также в сообщении указывается выбранное пользователем время года.
После обработки формы сервер возвращает броузеру информацию, которая будет представлена примерно в таком виде, как показано на рис. 3.9.
После обработки формы «Пете» будет послано сообщение следующего содержания:
Петр requested for information.
Адрес пользователя petya@mycomp.ru.
Любимое время года пользователя zima.
Для того, чтобы почта работала правильно, необходимо правильно сконфигурировать РНР. Для этого в файле php.ini необходимо указать имя почтового сервера, т.е. указать директиву SMTP и задать имя отправителя в директиве sendmail_from. Соответствующий фрагмент файла php.ini может выглядеть примерно так: [mail function]
SMTP= your.mailserver.ru ; for Win32 only
sendmail_from= me@localhost.com ; for Win32 only
;sendmail_path=; for unix only, may supply arguments as well (default is 'sendmail -t -i' )
РАБОТА С ФАИЛАМИ
Обработка содержимого файлов
Пересылка файлов по почте и отправка файлов серверу
Счетчики посещений и работа с сессиями
Рассмотрим пример PHP-программы, которая анализирует полученный файл, находит на нем все ссылки, описанные при помощи ярлыка < a href=...> и посылает броузеру список найденных ссылок.
Вначале мы создадим простой HTML-файл, в котором будет предусмотрена форма, содержащая текстовое окно для ввода файла или http адреса страницы, ссылки которой нас интересуют. Файл этот мы назовем cutref.htm.
Файл cutref.htm
<html>
<head>
<title>
URL-страницы для получения всех ссылок.
</title>
</head>
<body>
<Н1>Форма для ввода адреса страницы.</Н1>
<р align=center>Этa форма используется для того, чтобы указать адрес страницы
(файл или в формате http://host.name.xx/name.file),
все ссылки которой будут
выведены на экран броузера.<р>
<р>Сама страница, адрес которой был указан в поле для ввода текста, выведена не будет.
<form action="cutref.phtm" method="post">
Введите имя файла или http адрес: <input type=text name="filename">
<p><input type=submit value="Укaжитe адрес файла в текстовом поле и
нажмите кнопку">
</form»
</body>
</html>
Сохраним этот файл на сервере. После загрузки в броузер мы увидим страничку, показанную на рис. 4.1.
Следующий шаг — создание программы, которая бы смогла проанализировать полученный файл. Эта программа будет получать имя файла через переменную, посылаемую ей приведенной выше формой. Для этого в форме в текстовом поле мы укажем имя файла, затем нажмем кнопку.
В тексте файла cutref.htm мы указали адрес файла с РНР-програм- мой (значение атрибута action в ярлыке form) в виде cutref.phtm. Под таким именем мы и сохраним файл с анализирующим ссылки РНР- кодом.
Файл cutref.phtm
<?
echo "<pre>";
// качаем страницу в переменную $buf
$buf=implode("",file($filename));
// получаем ссылки в массив
preg_match_all("/<[Аа] [ \r\n\t]{1}[^>]*[Hh] [Rr] [Ее] [Ff] [^= ]*=[ '\"\n\r\t]*([ ^\"'>\r\n\t#]+)[^>]*>/",$buf,$url);
// выводим массив на экран
while($i<count($url[1])) { echo $url[1][$i++]."\n"; }
echo "</pre>";
?>
Сейчас, когда обрабатывающая программа готова и сохранена в файле с требуемым именем, можно отправить форму, для чего нажимаем кнопку формы. Через пару секунд в окне броузера появляется список ссылок (см. рис. 4.2).
Однако в тексте программы мы забыли явно инициализировать переменную $i, поэтому получили сразу три предупреждения о наличии нефатальных ошибок. Чтобы избежать вывода предупреждений на экран броузера, можно изменить режим вывода сообщений об ошибках. Мы же пойдем другим путем и исправим код программы. Вставим инструкцию $i=0 после комментария //выводим массивы на экран. Сейчас ошибок нет, и предупреждения не появятся (рис. 4.3).
Отправка файла в качестве почтового приложения
Пример отправки почты без использования почтового клиента с приложением HTML-письма и двоичного файла.
Текст PHP-кода помещен в файл mailatt.phtm.
Файл mailatt.phtm
<?
// Функции.
class html_mime_mail {
var $headers;
var $multipart;
var $mime;
var $html;
var $parts = array();
function html_mime_mail($headers="") {
$this->headers=$headers;
}
function add_html($html="") {
$this->html.=$html;
}
function build_html($orig_boundary,$kod) {
$this->multipart.="-$orig_boundary\n";
if ($kod= ='w' || $kod= ='win' || $kod= ='windows-1251') $kod='windows- 1251';
else $kod='koi8-r' ;
$this->multipart.="Content-Type: text/html; charset=$kod\n";
$this->multipart.="BCC: del@ipo.spb.ru\n";
$this->multipart.="Content-Transfer-Encoding: Quot-Printed\n\n";
$this->multipart.="$this->html\n\n";
}
function add_attachment($path="", $name="", $c_type="application/octet- stream") {
if (!file_exists($path.$name)) {
print "File $path.$name dosn't exist.";
return; .
}
$fp=fopen($path.$name,"r");
if (!$fp) {
print "File $path.$name coudn't be read."; return;
}
$file=fread($fp, filesize($path.$name) ) ;
fclose($fp);
$this->parts[ ]=array("body"=>$file, "name"=>$name,"c_type"=>$c_type);
}
function build_part($i) {
$message_part="" ;
$message_part.="Content-Type: ".$this->parts[$i] ["c_type"];
if ($this->parts[$i]["name"]!="")
$message_part.="; name = .$this->parts [$i] ["name"] ."\"\n";
else
$message_part.="\n"; $message_part.="Content-Transfer-Encoding: base64\n"; $message_part.="Content-Disposition: attachment; filename = \""
$this->parts[$i]["name"]."\"\n\n";
$message_part.=chunk_split(base64_encode($this->parts[$i]["body"]))."\n";
return $message_part;
}
function build_message($kod) {
$boundary="=_".md5(uniqid(time()));
$this->headers.="MIME-Version: 1.0\n";
$this->headers.="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$this->multipart="";
$this->multipart.="This is a MIME encoded message.\n\n";
$this->build_html($boundary,$kod);
for ($i=(count($this->parts)-1); $i>=0; $i-)
$this->multipart.="—$boundary\n".$this->build_part($i);
$this->mime = "$this->multipart—$boundary—\n";
}
function send($server, $to, $from, $subject="", $headers="")
$headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs ($fp,"MAIL FROM: $from\n");
fputs ($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs ($fp,$this->headers);
if (strlen ($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n2);
while(!feof($fp))
$resp.=fgets($fp,1024); fclose ($fp);
}
}
∕∕*****************************************************************************
∕∕
∕∕ В качестве приложения присоединяем html-письмо
// (открывается автоматически).
// Второе приложение — локальный файл.
// **************************************************************
$mail=new html_mime_mail() ;
$mail->add_html ("<html><body><center><h2>Привет! <br><br>" .
"<br>Посылаю двоичный файл [/bin/Is] ...".
"</h2></center></body></html>") ;
$mail->add_attachment("с:\vc.com");
$mail->build_message('win'); // если не "win", то кодировка koi8
$mail->send('mail.server.name',
'addressgto.name',
'address@from.name',
'посылаю файл');
//здесь mail.server.name — имя почтового сервера
//address@to.name — адресат, которому посылаем письмо
//address@from.name — адресата, от которого письмо отправлено
// посылаю файл — тема письма
?>
Загружаем файл mailatt.phtm в броузер. Броузер запрашивает соединение с Интернетом, осуществляет поиск указанного почтового сервера. Если сервер найден, происходит отправка файлов. Через несколько минут адресат получит отосланное письмо (рис. 4.4).
Отправка файла серверу
Для отправки файла серверу удобно использовать несложный РНР- скрипт. Вначале мы создадим HTML-страницу, в которой будут содержаться насколько форм, с помощью которых пользователь будет иметь возможность произвести выбор отправляемых серверу файлов. Отправляемые файлы должны находиться на локальных дисках пользователя. Для выбора файлов используется элемент управления формы <input type=«file»>. Этот элемент позволяет воспользоваться стандартными окнами системы windows, которые позволяют производить передвижение по локальной файловой системе и выбирать файлы.
Создадим файл upload.htm
Файл uplod.htm
<html> <head>
<title>PHP's FileUPLOAD</title>
</head>
<body>
<form method="post" action="upload.phtm" enctype="multipart/ form-data">
<input name="userfile[]" type="file">
<input name="userfile[]" type="file">
<input name="userfile[]" type="file">
<input narae="userfile[]" type="file">
<input type="submit" value="Upload!!! " >
</form>
</body>
</html>
С помощью этого HTML-файла мы выбираем файл на локальном диске и направляем его для обработки скрипту, расположенному программе в файле upload.phtm. Имя элемента формы задаем в виде userfilef]. Выбираем файлы, как показано на рис. 4.5.
Теперь создаем файл uipload.phtm.
Файл upload.phtm.
<?
for($i=0;$i<sizeof($userfile);$i++)
{
if(!$userfile_size[$i])
continue;
$UPLOAD = fopen ( $userfile [$i], "r" );
$contents = fread( $UPLOAD,$userfile_size[$i]);
fclose( $UPLOAD ) ;
$SAVEFILE = fopen( "upload/".$userfile_name[$i] , "wb" );
fwrite( $SAVEFILE, $contents,$userfile_size[$i] );
fclose( $SAVEFILE );
}
echo "Сервер получил файлы!";
?>
Рассмотрим этот код подробнее. В самом начале мы организуем цикл, с помощью которого проверяем все элементы массива userfile (каждый элемент содержит имя посылаемого серверу файла). Затем открываем очередной пользовательский файл для чтения с помощью fopen(), затем читаем его с помощью fread() и закрываем ресурс с применением fclose(). Затем мы открываем файл (ресурс) для записи при помощи fopen(), при этом необходимо убедиться, что в текущей директории есть папка upload, если такой папки нет, то файл не может быть открыт. Затем мы осуществляем запись в этот файл с помощью fwrite() и затем закрываем файл с помощью fclose().
После завершения работы скрипта в папке upload сервера мы найдем новые отправленные серверу файлы (см. рис. 4.7).
Простой счетчик посещений
С помощью языка РНР очень просто написать программу, которая будет осуществлять счет посещений той или иной странички. Причем используя РНР мы имеем в своем распоряжении богатый арсенал средств, позволяющий нам проделывать кроме пересчета посещений любые довольно сложные действия. Остановимся для начала на простом скрипте, пересчитывающим обращения к странице.
Скрипт, который мы сохраним в файле schetchikl.phtm, будет использовать переменную, пусть она называется $content, которую мы будем увеличивать на единицу всякий раз, как произойдет обращение к скрипту. После увеличения значения этой переменной, которая собственно и представляет собой счетчик, мы ее сохраним в файле с именем, например, C:\counter.
Таким образом, наша программа должна будет проделать следующие действия.
1.Открыть файл C:\counter для чтения.
2.Прочитать содержимое файла C:\counter в переменную $content.
3.Закрыть указатель на файл C:\counter.
4.Увеличить на единицу значение переменной $counter.
5.Открыть для записи файл C:\counter.
6.Записать содержимое переменной $counter в файл c:\counter.
7.Закрыть указатель на файл C:\counter.
8. Вывести текущее значение переменой $counter.
Простейший вариант скрипта, выполняющего такие действия, может выглядеть так.
Файл schetchikl.phtm
<?
$get = fopen("с:\counter" , "r");
$content = fread ($get, 500000);
fclose ($get);
$content++; "
$fput = fopen ("c:\counter", "w");
fwrite ($ f put, $content, 500000);
fclose ($fput);
echo "Страницу посетили <B> $content </B> раз."
?>
Сейчас загрузим страницу schetchikl.phtm в броузер и несколько раз нажмем кнопку обновления страницы в главной панели инструментов броузера. При каждом нажатии на эту кнопку счетчик будет показывать увеличение количества посещений на единицу (рис. 4.8).
Сейчас встает вопрос о том, как можно воспользоваться таким счетчиком на своей странице. Это сделать очень просто. Один из возможных вариантов выглядит так (файл schetchik_l.phtm).
<html>
<head>
<title>
Страница, количество посещений которой нужно просчитать.
</title>
<body>
<Н1>При посещении этой страницы активизируется счетчик.</hl>
<Р>Мы используем общий счетчик. Как только происходит обращение к счетчику, его значение увеличивается на единицу вне зависимсоти от того, откуда было произведено обращение к этому счетчику.
</р>
<?
include ("schetchikl.phtm");
?>
</body>
</html>
На экране компьютера мы будем видеть такую картинку (рис. 4.9).
Существует множество вариантов организации счетчиков посещений. Даже в том случае, если счетчик посещений служит для выполнения одной основной задачи — пересчету количества обращений к странице. Существует множество возможностей организации программного кода.
Рассмотрим еще один вариант. В этом случае счетчик посещений реализован с помощью средств работы с сессиями. Дело в том, что в РНР поддерживается возможность работы с сессиями. Переменные можно объявить глобальными. Глобальные переменные хранятся на диске в одном файле, которому соответствует уникальный идентификатор пользователя. При вхождении на web-cepeep пользователь получает такой идентификатор автоматически. В языке РНР идентификатор может быть установлен в явном виде при помощи функции session_id(). Если в счетчике задан один для всех общий идентификатор сессии, устанавливаемый всякий раз при обращении к счетчику, то уникальный пользовательский идентификатор для текущей сессии будет переписан в соответствии с указанным в session id() в качестве аргумента. Именно такой возможностью мы собираемся воспользоваться.
Чтобы переменные стали глобальными, и их значение было записано на диск, достаточно обратиться к функции session_register(), в качестве аргументов указав имена этих переменных. Итак, после всего сказанного, можно записать скрипт счетчика посещений, использующего работы с сессиями, в нашем случае мы устанавливаем идентификатор сессии в виде «global». Код скрипта восхитительно краток (файл counter, phtm).
Файл counter.phtm
<?php
session_id ("global");
session_register ("count");
$count++;
?>
Добрый день! Вы <? echo $count; ?> -ый посетитель этой странички.<р>
На экране мы увидим обычное сообщение (рис. 4.10).
Мы привели пример работы с сессиями. Заметим, что если бы мы не указали в явном виде идентификатор сессии, то счетчик стал бы пересчитывать посещения только этого конкретного пользователя!
РИСУНКИ.
ИНФОРМАЦИЯ О РНР
Вывод рисунков
Создаем рисунок
Скрытый вывод рисунков
Внешние рисунки
Информация, полученная с помощью phpinfof)
Текст в рисунках
Вывод рисунков
РНР обладает рядом функций, позволяющих создавать рисунки, манипулировать ими, осуществлять ввод и вывод рисунков. Для того, чтобы функции для работы с рисунками можно было использовать, необходимо убедиться в том, что библиотека для работы с рисунками у вас имеетск (она входит в стандартный дистрибутив в виде динамической библиотеки php_gd.dll), а также в том, что файл php.ini инициирован должным образом, т.е. что в нем содержится строка extension=php_gd.dll.
В разделе, посвященном рисункам, мы рассмотрим несколько базовых вопросов, ограничиваясь такими задачами: как создать рисунок средствами РНР, как вывести текстовую информацию в рисунке, как вывести рисунок броузеру и сохранить его в файле. Подробную информацию о возможностях работы с рисунками вы можете узнать из краткого справочника, приведенного в конце книги.
Создаем рисунок
Прежде чем мы сможем начать работать с рисунком, необходимо создать рисунок при помощи функции ImageCreate(x,x). Аргументами этой функции являются размеры картинки в пикселях. После того, как каркас рисунка создан, можно приступить к рисованию. РНР поддерживает целый ряд функций, позволяющих создавать рисунок программными средствами.
Другой важной особенностью процесса создания рисунков является то, что все используемые в процессе создания рисунка цвета должны быть явно определены и каждому цвету необходимо дать идентификатор. Это осуществляется с применением функции ImageColorAllocate(image, R, G, В). Здесь в качестве аргументов используются указатель (идентификатор) рисунка image, который определяет, с каким рисунком будет связан данный цвет. Этот параметр возвращается функцией ImageCreate() во время создания каркаса рисунка. Параетры RGB задают интенсивности красной, зеленой и синей компоненты цвета соответственно в пределах от 0 до 255, например:
$gray = ImageColorAllocate($image, 204, 204, 204) ;
Необходимо обратиться к этой функции столько раз, сколько различных цветов будет использовано в рисунке при его рисовании.
После того, как все цвета определены, можно приступить с собственно рисованию. Для этого существуют различные функции рисования линий, фигур, окружностей, эллипсов, прямоугольников, многоугольников, функции заливки и т.п. Подробно эти функции описаны в приложении. Так, например, для того, чтобы нарисовать прямую линию, используется функция ImageLine().
Нарисуем простую картинку, состоящую из синей линии, проведенной на сером фоне. Для этого напишем такой текст скрипта:
<?php
$image = ImageCreate(500, 400) ;
$gray = ImageColorAllocate($image, 204,204,204) ;
$blue = ImageColorAllocate($image, 0, 0, 255) ;
ImageLine($image,50,60,450,350,$blue);
?>
Аргументами функции являются идентификатор рисунка, координаты начальной точки, координаты конечной точки, идентификатор цвета.
Если теперь мы запомним этот текст в файле и загрузим его в броузер, предварительно обработав на сервере с помощью РНР, то мы ничего не увидим. Это произойдет потому, что мы не предусмотрели никакого вывода для созданного рисунка. Вывод созданного файла можно осуществить, обратившись к функции ImageJPEG(). В этом случае созданный рисунок будет сохранен в виде файла в формате jpeg. Первым аргументом функции imageJPEG() является указатель im созданного рисунка, второй аргумент — имя файла. После того, как файл создан, его можно посмотреть, для этого можно направить его броузеру. Окончательный вариант скрипта (файл imagel.php) выглядит следующим образом:
<?php
$image = ImageCreate(500, 400) ;
$gray = ImageColorAllocate($image,204,204, 204) ;
$b'lue = ImageColorAllocate ($image, 0, 0, 255) ;
ImageLine($image,50,60,450,350,$blue);
ImageJPEG($image,"file.jpg");
?>
<html>
<head>
<title>
Создаем рисунок средствами PHP
</title>
</head>
<body>
<hЗ>Это созданный нами файл рисунка:</НЗ> <Р>
<img src="file.jpg">
</P>
</body>
</html>
В окне броузера мы увидим такую картинку (рис. 5.1).
Скрытый вывод картинок
Остановим внимание на том, что возвращаемый в предыдущем примре HTML-код содержит информацию о рисунке, его имя, местоположение. Если мы нажмем кнопку броузера «Вид» и просмотрим полученное содержимое в текстовом редакторе «Блокнот», то сможем прочитать весь код в том виде, как он получен броузером. Он будет выглядеть так:
<html>
<head>
<title>
Создаем рисунок средствами РНР
</title>
</head>
<body>
<h3>Это созданный нами файл рисунка: </НЗ>
<Р>
<img src="file.jpg">
</P>
</body>
</html>
Мы знаем, что броузер получил рисунок file.jpg, расположенный в том же каталогое, в котором находится исходный файл imagel.php.
РНР предоставляет замечательную возможность осуществления отправки броузеру файлов изображений таким образом, что исходный файл и его местоположение будут скрыты от пользователя. Более того, файл на диске локальной файловой системы сервера вообще может не быть создан.
Для того, чтобы пояснить как такое может быть сделано, рассмотрим пример. Файл image.php — это видоизмененный текст предыдущего примера. Сейчас сохраним пример в виде файла image.php.
Файл image.php
<?php
Header("Content-type: image/jpeg");
$image = ImageCreate(500, 450) ;
$gray = ImageColorAllocate($image,204,204,204);
$blue = ImageColorAllocate($image, 0, 0, 255) ;
ImageLine($image,50,60,450,300,$blue);
ImageJPEG($image);
ImageDestroy($image);
?>
В этом примере мы внесли несколько изменений в предыдущий вариант (в файл imagel.php). Здесь завершает пример функция ImageDestroy, ее аргумент — указатель на рисунок. Эта функция уничтожает данный рисунок и освобождает память. Для нас более важным является инструкция header(«content-type: image/jpeg»). Эта инструкция посылает броузеру заголовок, который содержит информацию о типе посылаемых данных. В данном случае данные будут представлять собой содержимое картинки в формате jpeg. Другим важным моментом является тот факт, что в функции ImageJPEG() мы указали единственный аргумент — идентификатор рисунка, а файл для сохранения рисунка не указан. Именно этот факт послужил индикатором для того, чтобы рисунок был направлен прямо броузеру, обратившемуся к файлу image.php.
Теперь в окне броузера мы увидим ту же картинку, что и раньше, но если мы попытаемся рассмотреть полученный HTML-код, то броузер нам ничего полезного не предоставит, соответствующая опция будет выключена (рис. 5.2).
Внешние рисунки
В предыдущем примере мы направили броузеру рисунок, созданный средствами РНР. При этом пользователь не имеет возможности определить местонахождение источника рисунка.
Аналогичную задачу можно поставить при необходимости отправить броузеру рисунок, существующий в виде файла на жестком диске с тем условием, чтобы пользователь не имел возможности определить место хранения этого рисунка. Средствами РНР такая задача решается очень просто. Рассмотрим файл image 1.phtm — это и есть решение поставленной задачи.
Файл image 1 .phtm
<?php
header ("Content-type: image/jpeg");
$im = ImageCreateFromJPEG ("001.jpg");
imagejpeg ($im);
ImageDestroy($im);
?>
С помощью этого кода мы создаем рисунок $im из файла 001 .jpg, направляем его броузеру, предварительно отправив ему заголовок с указанием типа данных. Затем уничтожаем рисунок. В окне броузера видим картинку (рис. 5.3).
Пользователь, получивший эту картинку, не имеет возможности определить место хранения файла этого рисунка, он не может посмотреть HTML-код (рис. 5.4).
Если же пользователь попытается сохранить файл, выбрав в меню Файл пункт сохранить, то ему будет предложено сохранить его в формате HTML (рис. 5.5).
Сохраним файл imageljpeg.htm, а заетм посмотрим, что в нем содержится с помощью «Блокнота». Вот что сохранилось в файле image ljpeg.htm:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!- saved from url= (0025)http://mycomp/imagel.phtm —>
<HTML ><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META content="MSHTML 5.50.4611.1300" name=GENERATOR></HEAD>
<BODY ><IMG src="imagel_jpeg. fi.les/imagel. jpeg"x/BODY></HTML>
Как и следовало предположить, никакой информации о местоположении источника в этом файле не содержится. Здесь есть ссылка на файл, который инициализировал загрузку рисунка — это файл imagel.phtm. Но содержимое этого файла недоступно пользователю. Есть также ссылка на локальный файл с изображением. Этот файл был сохранен тогда, когда мы выбрали опцию сохранения текущей страницы, открытой в броузере.
Информация о РНР
В РНР существует очень полезная функция, с помощью которой можно получить информацию о многих свойствах и возможностях РНР, установленного на данном конкретном сервере. Это функция phpinfo(). Создадим файл phpinfo.php, в котором будет содержаться всего одна строчка.
Файл phpinfo.php.
<?php phpinfo()?>
Загрузим файл в броузер с сервера, на экране в окне броузера мы увидим информацию о текущей версии РНР (рис. 5.6).
В появившемся на экране броузера файле содержится много полезной информации.