Теперь, когда мы познакомились с реализацией cookie-наборов, посмотрим, как применить эти знания для создания cookie-наборов, используемых внутри сценариев. Наиболее очевидным методом установки cookie-набора в PHP-коде является создание заголовка Set-Cookie с помощью PHP-функции header (), как показано в листинге 6.2.
Листинг 6.2. Установка cookie-набора с использованием функции header () header("Set-Cookie: mycookie=myvalue; path=/; domain=.coggeshall.org"); ?>
Поскольку эта функция используется для отправки HTTP-заголовков, она должна быть выполнена до пересылки содержимого (например, с помощью операторов echo или print). Хотя это работает, такой метод не может быть рекомендован для установки cookie-наборов с использованием PHP-функций. Чуть позже мы рассмотрим функцию setcookie (), используемую для решения этой задачи. Второй (и, возможно, менее известный) метод установки cookie-наборов — использование HTML-дескрипторов. В частности, HTML-дескриптор <МЕТА> можно использовать для имитации HTTP-заголовков внутри HTML-страницы, применяя атрибуты HTTP-EQUIV и CONTENT. Например, чтобы установить такой же cookie-набор, как в листинге 6.2, можно воспользоваться HTML-кодом, представленным в листинге 6.3.
Листинг 6.3. Установка cookie-набора с использованием HTML-дескриптора <МЕТА> <HEAD> <!-- другой HTML-код //—> <МЕТА HTTP-EQUIV="Set-Cookie" CONTENT="mycookie=myvalue; path=/; domain=.coggeshall.org"> </HEAD> <!— остаток HTML-документа //—>
НА ЗАМЕТКУ Дескриптор <МЕТА> хорош не только для установки cookie-наборов. Несмотря на то что он зависит от используемого браузера, большинство известных браузеров поддерживают
HTTP-заголовки, заключенные в дескриптор <МЕТА>. Например, с помощью HTTP-заголовка Refresh можно перенаправить браузер на новую страницу: <МЕТА HTTP-EQUIV="Refresh" CONTENT="0; url=http://www.coggeshall.org"> Третий и возможно наиболее известный метод установки cookie-наборов — использование PHP-функции setcookie (). Функция setcookie () имеет следующий синтаксис: setcookie($name [,$value [, $expire [, $path [, $domain [, $secure]]]]]); Эта функция применяется как для создания, так и уничтожения cookie-наборов в клиентском браузере. Как и в случае с отсылкой HTTP-заголовков из РНР-сценария, эта функция должна быть выполнена до отправки клиенту любого содержимого. Перед тем как перейти к исследованию этой функции, вкратце рассмотрим каждый параметр. Для большинства частей назначение каждого параметра такое же, как и у заголовка Set-Cookie, рассмотренного ранее. В частности, $name представляет имя переменной cookie-набора, $value — ее текущее значение, $expire — метка времени Unix актуальности cookie-набора, $path — путь на сервере, для которого создан cookie-набор, $domain — домен, для которого создан cookie-набор, и, наконец, $ secure — это булевское значение, показывающее, что cookie-набор создан только для защищенного HTTP. При использовании функции setcookie() любые необязательные параметры могут быть при необходимости установлены в NULL. В листинге 6.4 показа пример применения функции setcookie () для установки cookie-набора, аналогичного приведенному в листинге 6.2.
Листинг 6.4. Использование функции setcookie () setcookie("mycookie", "myvalue", NULL, "/", ".coggeshall.org"); ?> Если нужно изменить значение cookie-набора, как в случае, когда мы напрямую ра- ботали с заголовком Set-Cookie, нужно убедиться, что значения $path, $domain и $name функции setcookie () идентичны первоначально использованным. Для удале- ния cookie-набора можно использовать небольшую хитрость — задать параметр $value равным NULL (при этом параметры $path, $domain и $name должны быть установлены должным образом). Пример удаления cookie-набора, установленного в листинге 6.4, представлен в листинге 6.5. Листинг 6.5. Удаление cookie-набора с использованием функции setcookie () setcookie("mycookie", NULL, NULL, "/", ".coggeshall.org"); ?>
После того как cookie-набор установлен, он остается неактивным до момента, когда браузер запросит у Web-сервера другой документ. Для получения доступа к значению cookie-набора, полученного от браузера, РНР использует суперглобальный массив $_С00К1Е. Этот массив аналогичен массивам $_GET и $_POST за исключением того, что он хранит значения cookie-наборов. Каждый ключ в этом суперглобальном массиве представляет отдельный cookie-набор (имя ключа — это имя переменной cookie-набора) . Для иллюстрации этого примера выполним общую задачу и напишем сценарий, определяющий, активен ли cookie-набор на клиентском браузере. Для этого, вопервых, потребуется создать cookie-набор, а потом заставить браузер перезагрузить страницу. Когда браузер перезагрузит страницу, он, если примет этот cookie-набор, немедленно вернет его серверу. Проверив наличие этого cookie-набора при перезагрузке страницы, можно проверить работоспособность cookie-набора. Единственная хитрость в этом сценарии — определить, был ли установлен cookie-набор или браузер по какой-либо причине его отверг. Для того чтобы дать возможность сценарию определить, был ли установлен cookie-набор, при перенаправлении браузера необходимо использовать параметр GET, как показано в листинге 6.6.
Видно, что сценарий разделен на две части. В первой половине оператора if делается попытка создать cookie-набор и затем перенаправить браузер на другую страницу с помощью дополнительного параметра GET. После повторного выполнения сценария с дополнительным параметром проверяется существование cookie-набора. В том случае, если клиент не поддерживает cookie-наборы, тестовый cookie-набор уничтожается вызовом функции setcookie () без параметров.