ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

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

Cookies

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