ВВЕДЕНИЕ

 

Когда мы впервые пускаемся в путешествие по сети Интернет, нас удивляют и поражают новые ранее невиданные возможности, открывающиеся перед нами прямо на экране домашнего компьютера. Чтобы пуститься в это путешествие, нам необходим всего лишь компьютер и телефонная линия. Компьютер оснащен необходимым для его работы программным обеспечением и модемом, с по­мощью которого он может общаться с удаленными «братьями по разуму», т.е. с подобными себе компьютерами. А чтобы общение компьютера с другими ком­пьютерами было понятно для человека, разработаны специальные интерфейсы, облегчающие общение человека с компьютером и компьютера с человеком.

Самым распространенным средством для работы в Интернете в настоящее время представляются программы-броузеры, т.е. программы, позволяющие пользо­вателю осуществлять непринужденное «брожение», «плавание» по сети Интернет, незаметно для него самого «перескакивая» из одного места («сайта») сети в другое, причем физически такие сайты могут быть отделены друг от друга расстояниями в десятки тысяч километров. Большие расстояния незаметны пользователю, на компьютере которого установлен броузер.

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

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

Примерами клиентских программ могут служить программы-броузеры. Одна­ко, это не единственный вариант реализации клиентских приложений. Клиентс­кими программами являются, например, почтовые программы, такие как, напри­мер, 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 или С. Однако, есть возможность воспользоваться наиболее компактными языками, разработанными специально для написания программ серверных сценариев, и одним из таких языков является язык РНР, который становится все более популярным.

 

 

 

 

 Глава 1

 

ЧТО ТАКОЕ РНР

 

 

Что такое РНР?

 

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-сервер, установить на нем РНР и сконфигурировать его.

Глава 2

 

УСТАНОВКА 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).

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

Глава 3

 

ПЕРВЫЕ ПРОГРАММЫ НА РНР

- Отладка программ

- Формы

- Имена и значения

- Передача пар имя/значение из формы программе РНР

- Обработка значений

- Программа РНР-почта

 

Первые программы на РНР

 

Сейчас мы уже можем писать свои первые программы на языке РНР, не отвлекаясь на то, как и где они будут работать. Этим вопросам были посвящены предыдущие главы. Мы знаем, как в целом должна выглядеть программа на РНР, как она может быть вставлена в HTML- код исходного phtm-файла.

Начнем с простого примера, в котором язык РНР используется для того, чтобы в отсылаемый броузеру код вставить заранее подготовлен­ный файл целиком. При этом в нашем phtm-файле появится лишь одна совсем маленькая инструкция includefooter.txt»).

Этого достаточно. Файл footer.txt будет вставлен в том месте HTML- кода, где находится функция includefooter.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' )

 

Глава 4

 

РАБОТА С ФАИЛАМИ

 

Обработка содержимого файлов

Пересылка файлов по почте и отправка файлов серверу

Счетчики посещений и работа с сессиями

 

Рассмотрим пример 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 typefile»>. Этот элемент позволяет воспользоваться стандар­тными окнами системы 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).

Мы привели пример работы с сессиями. Заметим, что если бы мы не указали в явном виде идентификатор сессии, то счетчик стал бы пересчитывать посещения только этого конкретного пользователя!

 

Глава 5

 

РИСУНКИ.

ИНФОРМАЦИЯ О РНР

Вывод рисунков

Создаем рисунок

Скрытый вывод рисунков

Внешние рисунки

Информация, полученная с помощью 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, ее аргумент — указатель на рисунок. Эта функция унич­тожает данный рисунок и освобождает память. Для нас более важным является инструкция headercontent-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).

В появившемся на экране броузера файле содержится много полез­ной информации.