Cookies и управление сессиями

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

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

Cookie

Cookie — это небольшой фрагмент информации, который серверные сценарии сохраняют на клиентской машине. Операции с ним можно описать в такой последовательности:

Дополнительная информация может добавляться в с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.

Cчетчик посещений

Счетчик посещений — весьма популярная категория скриптов. Основная их идея состоит в том, что при каждом запуске сценария происходит запись некоторой информации в файл или базу данных. Можно просто каждый раз добавлять единицу, а можно читать заголовки запроса клиента и писать их в базу. Конечно, лучший источник информации о посетителях сайта находится в журнальном файле Apache access.log в каталоге logs, но веб-мастер не всегда имеет доступ к журнальной статистике.

Установка cookies производится с помощью функции setcookie().

setcookie( name [, value [,expire [,path [,domain [, secure]]]]]) — создает HTTP-заголовок, содержащий cookie.

Эта функция имеет следующие параметры:

Давайте создадим простой сценарий, подсчитывающий при помощи 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() закрывает сессию. Все, теперь сессия недоступна, все ее переменные потеряны.




  • Другие |
назадвверхвперед
Rambler's Top100