Для разработки сайта, состоящего из многих страниц, необходимо научиться передавать данные из одной страницы в другую. Например, часто требуется передать сведения о посетителе, полученные в результате его регистрации на первой странице сайта. При этом возникает проблема: протокол HTTP не сохраняет состояния. Это означает, что данный протокол не имеет средств передачи какой-либо информации из одной страницы в другую. Если пользователь запрашивает одну за другой две страницы, HTTP не обеспечивает возможности уведомить, что оба запроса исходят от одного и того же пользователя.
Если пользователь побывал на сайте, то надо уметь передать в следующую веб-страницу информацию о его действиях на предыдущих страницах. Для этой цели можно использовать сookie
.
Cookie
Cookie
— это небольшой фрагмент информации, который серверные сценарии сохраняют на клиентской машине. Операции с ним можно описать в такой последовательности:
- Клиент отправляет HTTP-запрос серверу.
- Сервер посылает HTTP-прочего включающий в себя заголовок
Set-Cookie: var = value
- Клиент переходит на другую страницу того же сервера путем отправки нового запроса, включающего в себя заголо
- вок
Cookie: var = value
- Сервер отвечает клиенту.
-
Дополнительная информация может добавляться в
сookie
в виде необязательных атрибутов: domain
— определяет, в каком домене будут действоватьсookie
. По умолчанию — домен запрошенного ресурса;expires
— дата и время, после которогосookie
станет считаться недействительным и будет удален. По умолчанию сookie храниться только в памяти, и его срок истекает при закрытии браузера. В качестве времени жизнисookie
может использоваться:-
- дата, соответствующая давно прошедшему моменту времени. Тогда
сookie
окажется недействительным уже при первом предъявлении; - ячейка памяти, выделенная под
сookie
, вся заполняется единицами — это указывает на бесконечно далекое время в будущем. Такие сookie остаются действительными всегда; - текущий момент времени плюс сколько-то секунд. Вот столько секунд и будут действовать определенные таким образом
сookie
;
- дата, соответствующая давно прошедшему моменту времени. Тогда
path
— указывает путь до ресурса, в пределах которого действуетсookie
. По умолчанию ограничений нет.secure
— атрибут без значения, наличие которого указывает на то, чтосookie
может быть отправлен только по защищенному соединению (SSL).
Пример с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.
Эта функция имеет следующие параметры:
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оздадим файл регистрации пользователя и попросим ответить его на несколько вопросов.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Регистрация</title>
</head>
<body>
<form method="GET" action="71.php">
Введите имя:
<input type="text" name="name" value="">
<input type="submit" value="Готово!">
</form>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Теперь в сценарии sess1.php создадим сессию с помощью функции session_start()
. В сессии храняться переменные — похоже на хранилище, куда можно положить вещь(переменную), можно забрать ее оттуда, поменять на другую, а можно выбросить вон — уничтожить переменную сессии.
Прочитаем имя пользователя из массива $_GET
и запишем это имя в сессию. Для этого в нашем распоряжении имееется автоглобальный массив $_SESSION
.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Cоздание сессии</title>
</head>
<body>
<?php
session_start();
$new=$_GET["name"];
$_SESSION['new']=$new;
echo "Здравствуйте, ". $_SESSION['new'];
?>
<br> Щелкните по ссылке<br>
<a href="72.php">Начать тест</a>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Щелкая по ссылке, пользователь переходит на сценерий sess2.php. Наша цель узнать имя пользователя.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Чтение пересменнойй сессии</title>
</head>
<body>
<?php
session_start();
$var=$_SESSION['new'];
echo $var. ", ответьте, пожалуста, на вопрос. <br> ";
?>
<a href="73.php">Завершить тест</a>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
После ответов на тест надо завершить сессию. Перед закрытием удалим переменные сессии.
<?php
session_start();
$sess=$_SESSION["new"];
echo $sess.", тест пройден!<br/>";
unset($_SESSION['new']);
echo "Ваш тест закончен.";
session_destroy();
?>
В окне веб-браузера это будет выглядеть ТАК.
Функция unset()
удаляет переменную из сессии, а функция session_destroy()
закрывает сессию. Все, теперь сессия недоступна, все ее переменные потеряны.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться