Введение в PHP
Adam Trachtenberg и David Sklar (8/3/99)
Перевод на русский язык Н.В.Костроминой (30.11.2000 г.).

David Sklar (sklar@student.net) is the CTO of Student.Net Publishing.
Adam Trachtenberg (adam@student.net) is the Vice President for Production of Student.Net Publishing.

Предисловие переводчика.

Некоторое время назад мне потребовалось написать небольшой скрипт на языке PHP для Web-странички. Поскольку до того момента мне не приходилось встречаться с PHP, я начала искать в Интернет руководство по этому языку и первым делом, естественно, обратилась на сайт PHP Club (http://phpclub.unet.ru/index.php3?m=links). К счастью, я знала о существовании этого сайта. К моему удивлению обнаружилось, что документации по PHP на русском языке очень мало. Да что там мало, можно сказать, что ее нет вообще, ведь практически единственное русскоязычное руководство (http://www.webclub.ru/materials/php/) относится к версии 2 этого языка (а сейчас уже вышла версия 4.0.3).

Этот факт тем более удивителен, что язык PHP используется на массе серверов в Интернет. К сожалению, за неимением статистической информации не могу указать здесь точный процент, но могу привести такой факт. В ноябре 2000 г. на сайте http://nevod.ru/linux был проведен опрос на тему "На каком языке проще, быстрее и качественнее писать CGI?". В опросе приняло участие 954 респондента (по состоянию на 28.11.00). По результатам опроса PHP оказался на втором месте (после Perl) по популярности среди языков, используемых для создания CGI-скриптов. Perl набрал 334 голоса (35 процентов), а PHP - 232 голоса (24 процента). Все остальные языки, включая C, C++, Delphi и Visual Basic, набрали не более 11 процентов голосов. Конечно, тут надо сделать поправку на то, что опрос проводился на сайте, посвященном ОС Линукс, а значит, результаты опроса могут не совсем правильно отражать реальную картину использования разных языков, но все же эти результаты говорят о том, что PHP достаточно широко используется.

Среди англоязычной документации по PHP в списке ссылок на сервере PHP Club конечно было указано и полное руководство по этому языку (http://phpclub.unet.ru/manual). Но я выбрала для первоначального знакомства с PHP документ, который на PHP Club назван "наиболее удачным описанием PHP" (оригинал статьи Вы можете найти по адресу http://www.builder.com/Programming/PHPIntro/?). А поскольку документации на русском мало, я решила попутно перевести этот документ полностью. Этот перевод я и предлагаю вниманию всех, кого интересует PHP.

Кстати говоря, за то время, пока я переводила этот материал, я нашла в Интернет еще пару руководств по PHP на русском языке. Думаю, что Вам пригодятся соответствующие ссылки (для полноты я включила сюда и ссылку на упоминавшееся выше руководство Д.Брэндона ко второй версии PHP):

  • Дик Брэндон. PHP/FI Version 2.0. (http://www.webclub.ru/materials/php/) Перевод Юрия Плетнева.

  •  
  • Букварь по PHP и mySQL. (http://www.rusdoc.ru/material/web/about_php_rus_pdf.zip) - pdf-файл. Данный букварь просто поможет вам сделать первые шаги в изучении PHP и способах взаимодействия его с БД MySQL.

  •  
  • Shawn Wallace Введение в PHP. (http://spslug.sposad.ru/doc/phpintro.html) Перевод Михаила Крайнова.

  •  
  • С.Лосев. Рабочие инструменты сайтостроителя. (http://officesoft.agava.ru/index1.php3?path=articles/php1&ftype=article)
         В этом цикле статей, посвященного современному "сайтостроению", рассказывается о популярной системе MySQL и языке программирования PHP, как с их помощью можно решать задачи, с которыми сталкивается любой разработчик Интернет-сайта - подготовка и отображение новостей, ввод и отображение текстовой информации, поиск на сайте, организация дополнительных сервисов ("узнавания" посетителя, форумов, опросов и т.д.).
    Часть 1. Первое знакомство с PHP и MySQL (http://officesoft.agava.ru/index1.php3?path=articles/php1&ftype=article)
    Часть 2. Кругом новости, но как их ввести и отобразить? (http://officesoft.agava.ru/index1.php3?path=articles/php2&ftype=article)
    Часть 3. Статьи для сайта (http://officesoft.agava.ru/index1.php3?path=articles/php3&ftype=article)
    Часть 4. Дополнительные сервисы (http://officesoft.agava.ru/index1.php3?path=articles/php4&ftype=article)
  • Поскольку переведенный мной материал не повторяет эти руководства, надеюсь он будет полезен и читателям журнала "Мир ПК".

    Что такое PHP?

    PHP - это язык программирования для динамической генерации Web-страниц с помощью скриптов, запускаемых на Web-сервере. Вы создаете страницу с помощью PHP and HTML. Когда посетитель сайта открывает страницу, сервер выполняет включенные в html-код операторы PHP и посылает результат браузеру посетителя, точно так же, как это делается с помощью ASP или ColdFusion. Однако, в отличие от ASP или ColdFusion, PHP является продуктом с открытым исходным кодом (Open Source) и платформенно-независим. PHP работает на Windows NT и многих версиях Unix. Он может быть запущен как модуль в Apache или как исполняемая программа через CGI. В случае запуска в виде модуля Apache, PHP работает особенно легко и быстро. В этом случае отсутствуют накладные расходы, связанные с созданием процессов, поэтому результат выдается быстро, и не требуется настраивать mod_perl для уменьшения расходования памяти сервера.

    Кроме различных операций с содержимым Ваших страниц, с помощью PHP Вы можете формировать HTTP-заголовки, установить cookie, управлять аутентификацией и перенаправить пользователя на другую страницу. PHP предоставляет великолепные возможности по доступу к базам данных (и ODBC), а также интеграцию с различными внешними библиотеками. Это позволяет Вам делать все - от генерации PDF-документов до грамматического разбора в XML.

    Операторы PHP вставляются прямо в Ваши Web-страницы, так что нет необходимости в специальных средах разработки (IDE). Вы начинаете блок PHP-кода тегом <?php и заканчиваете его тегом ?>. (Вы можете сконфигурировать PHP так, что будут использоваться теги в стиле ASP: <% %> или теги вида <SCRIPT LANGUAGE="php"></SCRIPT>.) Все, что находится между этими тегами будет интерпретироваться как PHP-код.

    Синтаксис языка PHP подобен синтаксису C и Perl. Вы не должны объявлять переменные до их использования. Легко создаются массивы и хэши (ассоциативные массивы). PHP даже имеет какие-то зачатки объектно-ориентированного программирования, обеспечивая удобный способ организации кода и его инкапсуляции.

    Хотя PHP быстрее всего работает в том случае, когда он встроен в Apache, на Web-сайте PHP имеются инструкции по его установке на Microsoft IIS и Netscape Enterprise Server. Если у Вас еще нет копии программного обеспечения для установки PHP, Вы можете скачать ее с официального Web-сайта (http://www.php.net/). Там же Вы найдете подробное руководство, в котором описаны все функции и особенности PHP.

    Синтаксис PHP

    С основами синтаксиса PHP Вы знакомы. Следующий код

    <?php
    echo "Hello, World!";
    ?>

    дает

    Hello, World!

    Имена переменных обозначаются знаком $. То же самое "Hello, World!" можно получить следующим образом:

    <?php
    $message = "Hello, World!";
    echo $message;
    ?>

    Конкатенация (присоединение) строк осуществляется с помощью . (точки); обычные арифметические операции определяются так, как Вы того и ожидаете:

    <?php
    $greeting = "Hello ";
    $num = 3 + 2;
    $num++;
    echo "$greeting $num people!";
    ?>

    даст

    Hello 6 people!

    PHP имеет полный комплект операторов и они работают именно так, как Вы того ожидаете, особенно если у Вас имеется опыт работы с C или C++. При работе с PHP можно придерживаться простого правила: "Если сомневаешься, попробуй: скорее всего оно именно так и работает."

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

    <?php
    $name = 'Susannah';
    $greeting_1 = "Hello, $name!";
    $greeting_2 = 'Hello, $name!';
    echo "$greeting_1\n";
    echo "$greeting_2\n";
    ?>

    даст

    Hello, Susannah!
    Hello, $name!

    Обратите внимание на то, что \n в строке означает переход к новой строке, совсем как в Perl или в C. Однако это работает только в тех строках, которые взяты в двойные кавычки.

    Переменные

    PHP обеспечивает доступ к переменным окружения как к регулярным переменным (as regular variables), включая переменные окружения, которые установлены сервером для CGI-программ (даже если Вы запустили PHP как модуль). Поэтому, если на странице "http://www.domain.com/farm/cattle/cow-cow.cow.html" содержится PHP-код

    <?php
    echo "[$REQUEST_URI]";
    ?>

    то на выводимой странице Вы увидите [/farm/cattle/cow-cow-cow.html]

    Массивы

    Индексы массивов (как обычных, так и ассоциативных) задаются в квадратных скобках ([ и ]):

    $fruit[0] = 'banana';
    $fruit[1] = 'papaya';
    $favorites['animal'] = 'turtle';
    $favorites['monster'] = 'cookie';

    Если Вы присваиваете какое-то значение элементу массива, не указывая номера элемента (оставляете поле индекса пустым), PHP присоединяет объект к концу массива. Так для приведенного выше примера с массивом $fruit можно достичь того же самого результата, написав:

    $fruit[] = 'banana';
    $fruit[] = 'papaya';

    Вы можете также применять многомерные массивы:

    $people['David']['shirt'] = 'blue';
    $people['David']['car'] = 'minivan';
    $people['Adam']['shirt'] = 'white';
    $people['Adam']['car'] = 'sedan';

    Создать массив можно также путем вызова функции array():

    $fruit = array('banana','papaya');
    $favorites = array('animal' => 'turtle',
                        'monster' => 'cookie);

    или

    $people = array ('David' => array('shirt' => 'blue',
                                        'car' => 'minivan'),
                     'Adam' => array('shirt' => 'white',
                                        'car' => 'sedan'));

    Встроенная функция count() выдает число элементов в массиве.

    $fruit = array('banana','papaya');
    print count($fruit);

    выдаст

    2

    Управляющие конструкции

    Вы можете использовать операторы цикла, такие как for и while. В результате выполнения оператора

    for ($i = 4; $i < 8; $i++) {
       print "I have eaten $i bagels today.\n"; }

    получим

    I have eaten 4 bagels today.
    I have eaten 5 bagels today.
    I have eaten 6 bagels today.
    I have eaten 7 bagels today.

    Тот же самый результат даст

    $i = 4; while ($i < 8) {
       print "I have eaten $i bagels today.\n";
       $i++;
    }

    Вы можете также использовать конструкции с if и elseif:

    if ($user_count > 200) {
        print "Сайт сейчас перегружен!";
    } elseif ($user_count > 100) {
        print "Сайт активно используется!";
    else {
        print "Сайт свободен - подключились только $user_count пользователей.";
    }

    Сформулированное выше правило "Пробуй!" вполне применимо и в части управляющих конструкций. Вы можете использовать конструкции с switch, do...while и даже ?:.

    Простая форма

    Одна из наиболее удобных и приятных особенностей PHP - это его способность автоматически передавать значения переменных из форм в переменные PHP. Это очень облегчает обработку форм.

    Например, Вы обрабатываете форму, которая имеет поле ввода следующего вида:

    <INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris">

    и в то время, когда выводится страница с этим PHP-кодом, переменная $name имеет значение Glen Morris.

    Тогда Вы можете вывести это значение на экран:

    echo "Hi $name!";

    или вставить проверку в условном операторе:

    if ($name == "Glen Morris") { echo "Please check your email."; }

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

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

    Вывод формы

    Первая функция служит для вывода формы:

    <?php
    function display_form() {
      global $PHP_SELF;
    ?>
    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
    Имя:   <INPUT TYPE=TEXT NAME="name"><BR>

    Любимый сорт сыра: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie
                     <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar
                     <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

    Когда Вы предпочитаете есть сыр:
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">На завтрак
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">В обед
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">На ужин
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Поздно ночью

    <INPUT TYPE=HIDDEN NAME="stage" VALUE="results">
    <INPUT TYPE=SUBMIT VALUE="Thanks!">
    </FORM>
    <?php
    }
    ?>

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

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

    Кстати, строка

    global $PHP_SELF;

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

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

    Теперь обратите внимание на атрибут NAME тега INPUT. Вы видите, что в случае, если тип поля ввода есть CHECKBOX, то после наименования поля (в данном случае times[]) стоит пара квадратных скобок, Если же тип поля ввода есть RADIO, то после имени (cheese) таких скобок нет. Это объясняется тем, что поля типа RADIO служат для выбора одного и только одного из вариантов ответа, поэтому значением переменной cheese будет одна строка. Поля типа CHECKBOX (их несколько) позволяют выбрать (или не выбрать) каждый из возможных вариантов, поэтому для сохранения ответов пользователя PHP должен запомнить их в виде массива. Добавление [] после имени переменной times и указывает на то, что в данном случае это массив, а не единичная переменная.

    И, наконец, в этом куске кода имеется скрытая переменная с именем stage. Мы используем $stage чтобы сказать программе, хотим ли мы вывести форму или отобразить результаты обработки ответов.

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

    Теперь рассмотрим функцию process_form() обработки формы после ввода ответов пользователем.

    <?php
    function process_form() {
      global $name;
      global $cheese;
      global $times;

      if ($cheese == 'brie') { $cheese_message = 'I love brie.'; }
      elseif ($cheese == 'cheddar') { $cheese_message = 'Cheddar is awesome!'; }
      else { $cheese_message = 'Fresh mozzarella is divine.'; }

      $favorite_times = count($times);

      if ($favorite_times <= 1) {
        $times_message = 'You should eat cheese more often.';
      } elseif ($favorite_times > 1 && $favorite_times < 4) {
      $times_message = 'Those are good times to eat cheese.';
      } else {
        $times_message = 'You are eating too much cheese.';
      }

      echo "Hello $name.";
      echo "$cheese_message $times_message";
    }

    ?>

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

    Далее используется функция count() для того, чтобы подсчитать, сколько раз в день ест сыр человек, ответивший на наши вопросы. Если в предыдущем случае мы должны были сравнить ответ посетителя с каждым из возможных значений переменной $cheese, то при анализе значений переменной $favorite_times можно воспользоваться операциями сравнения "меньше чем" и "больше чем". Знаки && в условном операторе "$favorite_times > 1 && $favorite_times < 4" означают логическую операцию "И" ("and"). То есть $favorite_times должно одновременно быть больше 1 и меньше 4 для того, чтобы условие было выполнено.

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

    Организуем вывод формы

    Теперь, когда мы имеем эти две функции, остается добавить только маленький кусочек кода для того, чтобы вызвать их в нужной последовательности. Итак, после (или ниже) записи тела функций display_form() и process_form() добавляем:

    <?php

    if (empty($stage)) { display_form(); }
    else { process_form(); }

    ?>

    Здесь мы вначале проверяем, задано ли какое-либо значение переменной $stage. В PHP переменная считается пустой (empty), если ее значение не задано явно (то есть ей никогда не придаются значения по-умолчанию), или ей задано пустое значение (переменной присвоено значение пусто, если она приравнена пустой строке - '', или ей присвоено значение 0). Когда посетитель впервые попадает на нашу страницу, переменная $stage пуста. Поэтому на страницу будет выводиться форма с нашими вопросами; в противном случае мы должны обработать заполненную форму.

    И это все, что мы хотели сказать об обработке простых форм с помощью PHP.

    Многостраничные формы

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

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

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

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

    В результате мы будем иметь три функции вместо двух. В дополнение немного изменим их названия, чтобы они соответствовали изменившемуся содержанию. Функция display_form() теперь будет называться display_name().

    <?php
    function display_name() {
     global $PHP_SELF;

    ?>
    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
    Name: <INPUT TYPE=TEXT NAME="name"><BR>
    <INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese">
    <INPUT TYPE=SUBMIT VALUE="Thanks!">
    </FORM>
    <?php
    }
    ?>

    Она идентична ранее введенной функции за тем исключением, что мы удалили все вопросы, кроме первого, и изменили название следующего этапа на "cheese", чтобы дать более точное указание на то, что будет делаться на следующем этапе.

    Далее идет функция display_cheese().

    <?php
    function display_cheese() {
      global $PHP_SELF;
      global $name;

    ?>
    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
    Ваш любимый сорт сыра:
                     <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie
                     <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar
                     <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

    Когда Вы предпочитаете есть сыр:
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">на завтрак
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">на обед
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">на ужин
                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">поздно ночью

    <INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>">
    <INPUT TYPE=HIDDEN NAME="stage" VALUE="results">
    <INPUT TYPE=SUBMIT VALUE="Thanks!">
    </FORM>
    <?php
    }
    ?>

    Этот код вам тоже уже знаком. Тут не никаких неожиданных изменений по сравнению с предыдущим вариантом. Просто, перед тем как изменить значение скрытой переменной, используемой для определения этапа перемещения по нашим страницам, мы еще запоминаем имя и значение переменной $name, то есть ту часть информации, которая была получена на предыдущем этапе. При этом мы не просто напрямую передаем это значение, а пропускаем его через функцию PHP, которая называется htmlspecialchars(). Стандарт HTML определяет четыре символа, которые не могут использоваться в других целях, кроме как в тегах для разметки документов : <, >, ", и &. По этой причине, для того чтобы убедиться, что мы не поставим браузер пользователя в затруднительное положение, мы пропускаем $name через функцию htmlspecialchars(), чтобы некто, имеющий имя "Bret & Jeff", так и остался "Brett & Jeff."

    Теперь, когда передается информация, введенная в эту форму, мы не потеряем ни одной части этой информации.

    В результате этого трюка у нас нет необходимости что-либо менять в функции process_form(). Мы даже не меняем название функции. И в операторе, определяющем логику отображения страниц, мы добавляем только одну строку:

    <?php
    if (empty($stage)) { display_name(); }
    elseif ($stage == 'cheese') { display_cheese(); }
    else { process_form(); }
    ?>

    Что мы видим? Все, что мы сделали, - добавили elseif в серединку между двумя предыдущими операторами. В этом прелесть использования переменной $stage. Если мы хотим добавить дополнительные страницы, нам нужно только написать новые функции для отображения того, что мы хотим, и еще по одной строке в оператор управления в соответствии с тем, когда эти страницы должны быть отображены.

    Cookies

    Примечания переводчика: 1) если Вы плохо представляете себе, что такое cookie, прочитайте очень хороший материал на эту тему "Что такое cookies и как с ними работать" Андрея Аликберова (http://www.citforum.ru/internet/html/cookie.shtml)
    2) я не знаю русского эквивалента термину cookie (так же как и А.Аликберов), так что в тексте этот термин оставлен в английской транслитерации.

    Установка и считывание cookies в PHP - это, можно сказать, подарок судьбы! Мы не хотим заниматься здесь агитацией в пользу cookie, но нельзя не сказать, что это очень удобный инструмент.

    Для создания и модификации значения cookie используется функция PHP setcookie(). Функция setcookie() воспринимает до шести аргументов, в зависимости от того, как Вы собираетесь управлять значениями cookie и кто будет считывать ее значения.

    Простейший способ установить cookie таков:

    setcookie('name', 'bret');

    Затем, для каждой последующей страницы на Вашем сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт) переменная $name будет иметь значение 'bret' и его можно легко прочитать средствами PHP. Этот тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.

    Если Вы хотите, чтобы значение cookie запоминалось браузером после того, как пользователь закончит сессию, Вы должны передать функции setcookie() третий параметр - дату истечения срока действия cookie. Поскольку PHP сформировался в основном в среде Unix, Вы должны представить время истечения срока действия cookie как число секунд, прошедших с 1 января 1970 г. Если Вы имеете опыт программирования для Unix, это не покажется Вам удивительным. Но, если Вы программировали только в среде Windows или Macintosh, Вы, может быть, удивитесь, что за чокнутый народ эти Unix-оиды.

    Но не бойтесь. PHP имеет очень удобную функцию, mktime(). Вы указываете ей в качестве параметров (в указанном порядке) час, минуту, секунду, месяц, день и год, задающие тот момент времени, который Вы хотите представить в воспринимаемом UNIX формате, и mktime() возвращает Вам число секунд, прошедших с 1 января 1970 г. до указанного момента времени. Например, если Вы хотите, чтобы срок действия cookie истек 1 января 2000 г., Вы записываете:

    <?php
    $y2k = mktime(0,0,0,1,1,2000);
    setcookie('name', 'bret', $y2k);
    ?>

    Если Вы хотите изменить значение cookie на новое, Вы можете просто переписать его (ее?) значение. Таким образом, даже если браузер уже посылал значение cookie серверу на одной из предыдущих страниц, вполне возможно сообщить серверу, что в действительности Вас зовут "jeff."

    <?php
    $y2k = mktime(0,0,0,1,1,2000);
    setcookie('name', 'jeff', $y2k);
    ?>

    Обратите внимание на то, что при этом не меняется значение переменной $name. Оно устанавливается при загрузке страницы. Если Вы хотите чтобы значение переменной изменялось синхронно с изменением значения cookie, Вы должны изменить код следующим образом:

    <?php
    $name = 'jeff';
    $y2k = mktime(0,0,0,1,1,2000);
    setcookie('name', $name, $y2k);
    ?>

    Следующие два параметра функции setcookie() позволяют Вам задать путь и имя домена того, кто может прочитать значение Вашего cookie. По умолчанию только страницы, расположенные в том же каталоге или ниже в структуре подкаталогов того сервера, который установил cookie, могут прочитать его (ее??) значение. Это делается из соображений безопасности. Однако, если у Вашего сервера два доменных имени: "www.domain.com" и "other.domain.com", и Ваш экаунт позволяет Вам обслуживать страницы из каталога ~/myhome, Вы должны вызывать функцию setcookie() следующим образом:

    <?php
    setcookie('name', 'jeff', $y2k, '~/myhome', '.domain.com');
    ?>

    Последний параметр функции setcookie(), который мы никогда не использовали, требует, чтобы значение cookie передавалось только на те Web-сервера, которые используют безопасный протокол соединения, такой как SSL. Если Вам это нужно, то задайте для шестого параметра значение 1.

    Удалить cookie тоже очень просто, достаточно передать функции setcookie() имя cookie и PHP сделает все остальное:

    <?php setcookie('name'); ?>

    В заключение нужно сделать еще одно замечание, касающееся использования cookie. В силу того, как организована обработка cookies в протоколе HTTP, необходимо установить значения всех cookie до вывода какого-либо текста. Если сделать наоборот, PHP выдаст Вам предупреждение и значение cookie не будет послано. Вот так правильно:

    <?php
    setcookie('name', 'jeff');
    echo "Hello Everyone!";
    ?>

    А так - нет:

    <?php
    echo "Hello Everyone!";
    setcookie('name', 'jeff');
    ?>

    Время и даты

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

    Для того, чтобы отобразить в определенном формате дату и время, воспользуйтесь функцией date(). Для нее требуется задать два аргумента: описание формата вывода даты и указание того момента времени, информацию о котором Вы хотите вывести. Указание на момент времени дается в форме "число секунд с начала 1970 года". (Если Вы хотите вывести текущее время, Вы можете воспользоваться функцией time(), которая возвращает значение текущего времени.) Функция date() имеет массу опций форматирования, таких же как у функции strftime() в C или у функции POSIX::strftime() в Perl.

    <?php
    $birthday_stamp = mktime(19,45,0,3,10,1975);
    $birthday_formatted = date('F d, Y - g:i a',$birthday_stamp);

    echo "Давид родился $birthday_formatted."
    ?>

    дает

    Давид родился March 10, 1975--7:45 p.m.

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

    <SELECT NAME="when">
    <?php
    $d = time();
    for ($i = 0; $i < 10; $i++) {
    echo '<OPTION VALUE="'.$d.'">'.date('F d',$d);
    $d += 86400;
    }
    ?>
    </SELECT>

    Этот кусок кода служит для вывода на экран списка выбора, включающего 10 вариантов ответа -- сегодня и каждый из последующих 9 дней. До начала выполнения цикла мы сохраняем текущее время в переменной $d. В каждом варианте выбора, задаваемом строкой <OPTION>, значение "value" устанавливается равным соответствующей временной отметке в формате Unix, а на экран выводится месяц и день ("July 27," "July 28," и так далее.) После вывода каждой даты (каждой строки <OPTION>), значение $d увеличивается на 86,400 (столько секунд в сутках -- 24 часа * 60 минут * 60 секунд).

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

    <?php

    function display_form() {
      global $PHP_SELF;

    $dotw = array('Sunday','Monday','Tuesday','Wednesday','Thursday',
         'Friday','Saturday');
    $months = array( 1 => 'January','February','March','April','May','June',
                    'July','August','September','October','November','December');
    ?>
    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
    Find the first
    <SELECT NAME="dotw">
    <?php
    for ($i = 0; $i < 7; $i++) {
        echo "<OPTION> $dotw[$i]";
    }
    echo '</SELECT> after <SELECT NAME="month">';
    for ($i = 1; $i <= 12; $i++) {
        echo "<OPTION VALUE=\"$i\"> $months[$i]";
    }
    echo '</SELECT> <SELECT NAME="day">';
    for ($i = 1; $i <= 31; $i++) {
        echo "<OPTION> $i";
    }
    echo '</SELECT>, <SELECT NAME="year">';
    $start_year = date('Y') - 10;
    $end_year = $start_year + 20;
    for ($i = $start_year; $i <= $end_year; $i++) {
        echo "<OPTION> $i";
    }
    echo '<INPUT TYPE="HIDDEN" NAME="stage" VALUE="process">';
    echo '</SELECT> <INPUT TYPE="SUBMIT" VALUE="Do it!"7></FORM>';
    }

    ?>

    В этой функции очень мало таких моментов, которые мы еще не обсуждали. Массив $months записан немного по-другому, потому что мы хотим, чтобы индекс массива начинался с 1, а не с 0. Основную часть этой формы гораздо легче сформировать программно, вместо того, чтобы перечислять все значения элементов, так что единственная часть display_form(), которая формируется не в режиме PHP, - это строка в самом начале формы. Задание значений переменных $start_year и $end_year с помощью date('Y') служит для определения границ интервала времени, начинающегося за 10 лет до текущего года и заканчивающегося через 20 лет после него.

    А теперь напишем функцию для обработки формы:

    <?php

    function process_form() {
        global $dotw;
        global $month;
        global $day;
        global $year;
        $timestamp = mktime(0,0,0,$month,$day,$year);

        $next_dotw = '';
        $next_timestamp = $timestamp;

        while ($next_dotw != $dotw) {
          $next_timestamp += 86400;
          $next_dotw = date('l',$next_timestamp);
        }

        $formatted_first = date('F d, Y',$timestamp);
        $formatted_next = date('F d, Y',$next_timestamp);
        echo "The first $dotw after $formatted_first is $formatted_next.";
    }
    ?>

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

    Затем организуется цикл перехода к следующему дню недели, пока значение "next day" не совпадет с днем недели, указанным пользователем. Пока они различаются, значение "next day" увеличивается на 86400 секунд (вы помните, это равно 24 часа * 60 минут * 60 секунд) название дня недели перевычисляется.

    Когда эти два значения совпадут, process_form() выдаст следующее сообщение:

    The first Sunday after June 25, 1999 is June 27, 1999.

    Осталось только записать оператор, связывающий эти две функции воедино:

    <?php

    if (empty($stage)) { display_form(); }
    else { process_form(); }

    ?>

    Код для обработки даты и времени часто должен быть более изощренным, чем в приведенном примере, для того, например, чтобы обрабатывать переход на летнее время или временные зоны. Однако функции date() и mktime() все равно остаются основными инструментами для преобразования меток времени из формата, принятого в Unix, в понятный человеку формат и обратно. Функции date() и mktime() оперируют с отметками времени в локальной временной зоне Вашей машины. Если Вы хотите оперировать с временем по Гринвичу (Greenwich Mean Time - GMT), Вы можете использовать gmdate() и gmmktime().

    Например, если Вы (и Ваш компьютер) живете во временном поясе, в котором время отстает от Гринвича на 4 часа, Вы можете написать:

    <?php

    $today = mktime(12,0,0,6,25,1999);
    echo 'У нас сейчас '.date('g:i:s a, F d, Y',$today);
    echo '';
    echo 'По Гринвичу сейчас '.gmdate('g:i:s a, F d, Y',$today);

    ?>

    Это код выдает следующее сообщение:

    У нас сейчас 12:00:00 pm, June 25, 1999
    По Гринвичу сейчас 4:00:00 pm, June 25, 1999

    Заключение

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

    В настоящей заметке приведены только самые начальные сведения о PHP. Этот язык имеет много других возможностей. PHP позволяет легко сохранять и извлекать информацию из различных баз данных: MySQL, Oracle, Microsoft SQL Server и других. Вы можете на лету создавать и модифицировать графические образы. Вы сможете изменять текст с помощью регулярных выражений. Вы можете улучшать Ваши программы с помощью IMAP, LDAP, PDF, SNMP, WDDX, XML и многого другого.

    Для того, чтобы получить самую последнюю информацию о PHP (и чтобы скачать необходимое ПО) загляните на официальный сайт (http://www.php.net/). Он-лайновое руководство (http://www.php.net/manual/) является великолепным справочником по функциям PHP и их использованию. Вы можете даже внести свой вклад, поделившись своими достижениями с другими программистами, использующими PHP. Таким образом, даже руководство по сути представляет собой часть открытого исходного кода.

    Если Вы хотите более интенсивно общаться с представителями сообщества пользователей PHP, то подпишитесь на список рассылки, с помощью которого Вы сможете задать все возникающие у Вас вопросы и получить ответы на них от основных разработчиков PHP. На странице поддержки (http://www.php.net/support.php3) Вы найдете всю информацию о списках рассылки и ссылки на другие полезные ресурсы.