Для разработки сайта, состоящего из многих страниц, необходимо научиться передавать данные из одной страницы в другую. Например, часто требуется передать сведения о посетителе, полученные в результате его регистрации на первой странице сайта. При этом возникает проблема: протокол HTTP не сохраняет состояния. Это означает, что данный протокол не имеет средств передачи какой-либо информации из одной страницы в другую. Если пользователь запрашивает одну за другой две страницы, HTTP не обеспечивает возможности уведомить, что оба запроса исходят от одного и того же пользователя.
Если пользователь побывал на сайте, то надо уметь передать в следующую веб-страницу информацию о его действиях на предыдущих страницах. Для этой цели можно использовать сookie.
Cookie — это небольшой фрагмент информации, который серверные сценарии сохраняют на клиентской машине. Операции с ним можно описать в такой последовательности:
Клиент отправляет HTTP-запрос серверу.
Сервер посылает HTTP-прочего включающий в себя заголовок
Set-Cookie: var = value
Клиент переходит на другую страницу того же сервера путем отправки нового запроса, включающего в себя заголовок
Cookie: var = value
Сервер отвечает клиенту.
Дополнительная информация может добавляться в сookie в виде необязательных атрибутов:
domain — определяет, в каком домене будут действовать сookie. По умолчанию — домен запрошенного ресурса;
expires — дата и время, после которого сookie станет считаться недействительным и будет удален. По умолчанию сookie храниться только в памяти, и его срок истекает при закрытии браузера. В качестве времени жизни сookie может использоваться:
дата, соответствующая давно прошедшему моменту времени. Тогда сookie окажется недействительным уже при первом предъявлении;
ячейка памяти, выделенная под сookie, вся заполняется единицами — это указывает на бесконечно далекое время в будущем. Такие сookie остаются действительными всегда;
текущий момент времени плюс сколько-то секунд. Вот столько секунд и будут действовать определенные таким образом сookie;
path — указывает путь до ресурса, в пределах которого действует сookie. По умолчанию ограничений нет.
Пример сookie, отправленного сервером:
Set-cookie: name = smth; domain = our.org; expires Mon, 22 Jan 2009 14:51:20 GMT; path =/ ; secure
Заголовок сookie, который будет передаваться в следующем запросе:
Cookie: name =smth
Атрибуты, включаемые в заголовок Set-cookie, используются только для определения того, будет ли cookie включен в следующий запрос. Если и будет, то в запросе появится только имя и значение (name =smth).
В РНР значение сookie можно получить из суперглобального массива $_COOKIE.
Рассмотрим пример, где происходит попытка отправить клиенту сookie и получить его обратно — этим проверяется, установлена ли поддержка сookie у клиента.
<?php
$cookie=$_COOKIE["test"];
if (!$cookie)
{
setcookie("test", "1", 0x7FFFFFFF);
}
else
{
@$test=$_COOKIE["test"];
if (!$test)
{
echo ("Хорошо бы включить cookies");
}
else
{
echo "Работает!";
}
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Каждый браузер хранит cookie в своем специально выделенном для cookie каталоге. Если вы работаете с Internet Explorer, откройте каталог Documents and Settings на системном диске, найдите там каталог с именем вашей учетной записи, а в нем каталог Cookies.
Счетчик посещений — весьма популярная категория скриптов. Основная их идея состоит в том, что при каждом запуске сценария происходит запись некоторой информации в файл или базу данных. Можно просто каждый раз добавлять единицу, а можно читать заголовки запроса клиента и писать их в базу. Конечно, лучший источник информации о посетителях сайта находится в журнальном файле Apache access.log в каталоге logs, но веб-мастер не всегда имеет доступ к журнальной статистике.
Установка cookies производится с помощью функции setcookie().
setcookie( name [, value [,expire [,path [,domain [, secure]]]]]) — создает HTTP-заголовок, содержащий cookie.
Эта функция имеет следующие параметры:
name - имя устанавливаемого cookie;
value - значение, хранящееся в cookie с именем $name;
expire - время в секундах с начала эпохи, по истечение которого текущий cookie становится недейтвительным;
path - путь, по которому доступен cookie;
domain - домен, из которого доступен cookie;
secure - директива, определяющая, доступен ли cookie не по запросу HTPPS. По умолчанию эта директива имеет значение 0, что означает возможность доступа к cookie по обычному запросу HTTP.
Давайте создадим простой сценарий, подсчитывающий при помощи cookies количество обращений посетителя к странице.
В cookie с именем counter будет храниться число посещений страницы пользователем:
<?php
$counter++;
setcookie("counter",$counter);
echo "Вы посетили эту страницу $counter раз";
?>
В окне веб-браузера это будет выглядеть ТАК.
При работе с cookies необходимо учитывать важный момент, заключающийся в том, что cookie надо обязательно устанавливать перед отправкой в броузер каких-либо заголовков, поскольку сами cookies устанавливаются в виде заголовков. Поэтому если установить cookies после какого-либо текста, отправляемого в броузер, то возникнет ошибочная ситуация.
Рассмотрим этот вопрос подробнее, для чего модифицируем код, приведенный в предыдущем примере:
<?php
@$counter=$_COOKIE["counter"];
if (!isSet($counter))
{
$counter=0;
}
$counter++;
setcookie("counter", $counter, 0x7FFFFFFF);
?>
<html>
<head>
<title>Счетчик посещений</title>
</head>
<body>
<? if ($counter= =1)
{ ?>
<h1> Добро пожаловать! </h1>
<? }
else
{ ?>
<h1> Вы зашли на эту страницу в <? echo $counter ?> раз! </h1>
<? }
?>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Если же надо идентифицировать клиента, можно в качестве значения cookie отправить случайное число, сгенерированное функцией uniqid(). Вызванная без параметров, она возвращает строку с уникальным идентификатором.
<?php
$id=uniqid(" ");
setcookie("id", $id, 0x7FFFFFFF);
echo $id;
?>
Можно задать время жизни cookie, например, используя функцию time(), которая возвращает количество секунд, прошедших с 1 января 1970 г., 00:00:00 до текущего времени.
setcookie("id", $id, time()+600);
В данном случае cookie будет жить 10 минут.
Cookie представляет весьма полезный механизм учета сосотояния, но пользователь может отключить возможность принимать cookie, и тогда сервер не сможет получить обратно посланные клиенту данные.
Идея управления сессиями заключается в отслеживании перехода пользователя с одной страницы сайта на другую в течении одного сеанса связи с веб-сервером. Если это удастся осуществить, мы сможем предоставить пользователю содержимое сайта в соответствии с его уровнем прав доступа или персональными настройками. Сессия представляет собой группу переменных, которые в отличие от обычных переменных, сохраняются и после завершения выполнения РНР-сценария. Сессия идентифицируется номером, который передается сценарию в виде cookie или параметра в адресной строке.
При работе с сессиями различают следующие этапы:
Самый простой способ открытия сессии заключается в использовании функции session_start(), которая вызывается в начале PHP-сценария.
session_start() — проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.
Функция отправляет клиенту заголовок с номером сессии, поэтому до вызова этой функции из сценария в браузер не должно передаваться ничего, даже тег HTML, даже пробел. Иначе вы получите сообщение о попытке повторной отсылки заголовков, и сценарий завершит работу.
Напишем несколько скриптов, демонстрирующих использование сессий.
Cоздадим файл регистрации пользователя и попросим ответить его на несколько вопросов.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Регистрация</title>
</head>
<body>
<form method="GET" action="sess1.php">
Введите имя:
<input type="text" name="name" value="">
<input type="submit" value="Готово!">
</form>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Теперь в сценарии sess1.php создадим сессию с помощью функции session_start(). В сессии храняться переменные — похоже на хранилище, куда можно положить вещь(переменную), можно забрать ее оттуда, поменять на другую, а можно выбросить вон — уничтожить переменную сессии.
Прочитаем имя пользователя из массива $_GET и запишем это имя в сессию. Для этого в нашем распоряжении имееется автоглобальный массив $_SESSION.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Cоздание сессии</title>
</head>
<body>
<?php
session_start();
$new=$_GET["name"];
$_SESSION['new']=$new;
echo "Здравствуйте, ". $_SESSION['new'];
?>
<br> Щелкните по ссылке<br>
<a href="sess2.php">Начать тест</a>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Щелкая по ссылке, пользователь переходит на сценерий sess2.php. Наша цель узнать имя пользователя.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Чтение пересменнойй сессии</title>
</head>
<body>
<?php
session_start();
$var=$_SESSION['new'];
echo $var ", ответьте, пожалуста, на вопрос. <br> ";
?>
<a href="sess3.php">Завершить тест</a>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
После ответов на тест надо завершить сессию. Перед закрытием удалим переменные сессии.
<?php
session_start();
$sess=$_SESSION["new"];
echo $sess.", тест пройден!<br/>";
unset($_SESSION['new']);
echo "Ваш тест закончен.";
session_destroy();
?>
В окне веб-браузера это будет выглядеть ТАК.
Функция unset() удаляет переменную из сессии, а функция session_destroy() закрывает сессию. Все, теперь сессия недоступна, все ее переменные потеряны.