главная :: основы PHP
Заголовок
Что такое cookie?
Cookie представляет собой небольшой пакет информации, переданный web-сервером и хранящийся на клиентском компьютере. В cookie
можно сохранить полезные данные, описывающие состояние пользовательского сеанса, чтобы в будущем загрузить их и восстановить
параметры сеансовой связи между сервером и клиентом. Cookie используются на многих сайтах Интернета для расширения возможностей
пользователя и повышения эффективности сайта за счет отслеживания действий и личных предпочтений пользователя. Возможность
хранения этих сведений играет ключевую роль на сайтах электронной коммерции, поддерживающих персональную настройку и целевую
рекламу.
Вследствие того, что cookie обычно связываются с конкретным пользователем, в них часто сохраняется уникальный идентификатор
пользователя (UIN). Этот идентификатор заносится в базу данных на сервере и используется в качестве ключа для выборки из базы всей
информации, связанной с этим идентификатором. Конечно, сохранение UIN в cookie не является обязательным требованием; вы можете
сохранить любую информацию при условии, что ее общий объем не превосходит 4 Кбайт (4096 байт).
Компоненты cookie
В cookie хранятся и другие компоненты, при помощи которых разработчик может ограничивать использование cookie с позиций домена, пути,
срока действия и безопасности. Ниже приведены описания различных компонентов cookie:
Имя — имя cookie является обязательным параметром, по которому программа ссылается на cookie. Можно провести аналогию между
именем cookie и именем переменной.
Значение — фрагмент данных, связанный с именем cookie. В этих данных может храниться любая информация — идентификатор
пользователя, цвет фона, текущая дата и т. д.
Срок действия — дата, определяющая продолжительность существования cookie. Как только текущая дата и время превосходят заданный
срок действия, cookie становится недействительным и перестает использоваться. В соответствии со спецификацией cookie устанавливать
срок действия для cookie необязательно. Тем не менее, средства РНР для работы с cookie требуют, чтобы срок действия устанавливался.
Согласно спецификации, если срок действия не указан, cookie становится недействительным в конце сеанса (то есть когда пользователь
покидает сайт).
Домен — домен, который создал cookie и может читать его значение. Если домен состоит из нескольких серверов и доступ к cookie
должен быть разрешен всем серверам, то имя домена можно задать в форме .phprecipes.com. В этом случае все потенциальные домены
третьего уровня, принадлежащие сайту PHPrecipes (например, wap.phprecipes.com или news.phprecipes.com), смогут работать с cookie. По
соображениям безопасности cookie могут устанавливаться только для домена сервера, пытающегося создать cookie. Данный компонент
необязателен; если он не указан, по умолчанию используется имя домена, из которого было полу; чено значение cookie.
Путь — URL, с которого предоставляется доступ к cookie. Любые попытки получения доступа к cookie за пределами этого пути
пресекаются. Данный компонент необязателен; если он не задан, по умолчанию используется путь к документу, создавшему cookie.
Безопасность — параметр, показывающий, допускается ли чтение cookie в небезопасной среде. По умолчанию используется значение
FALSE.
Хотя при создании cookie используются одни и те же синтаксические правила, формат хранения cookie зависит от браузера. Например,
Netscape Communicator хранит cookie в формате следующего вида:
.phprecipes.com FALSE / FALSE 97728956 bgcolor blue
В Internet Explorer то же самое cookie выглядело бы иначе:
bgcolor
blue
localhost/php4/php.exe/book/13/
0
2154887040
29374385
522625408
29374377
*
Чтобы просмотреть cookie, сохраненные браузером Internet Explorer, достаточно открыть их в любом текстовом редакторе. Помните, что
некоторые редакторы не обрабатывают завершающие символы новой строки и на месте этих символов в документе могут выводиться
квадратики.
Internet Explorer сохраняет свои cookie в папке с именем «Cookies», a Netscape Communicator использует для этой цели один файл с
именем cookies.
Cookie и РНР
Хватит теории. Конечно, вам не терпится поскорее узнать, как задать значение cookie в РНР. Оказывается, очень просто — для этой цели
используется стандартная функция setcookie( ).
Функция setcookie( ) сохраняет cookie на компьютере пользователя. Синтаксис функции setcookie( ):
int setcookie (string имя [string значение [, int дата [, string путь [, string домен [, int безопасность]]]]])
Если вы прочитали общие сведения о cookie, то смысл параметров setcookie( ) вам уже известен. Если вы пропустили этот раздел и не знакомы
с компонентами cookie, я рекомендую вернуться к началу главы и перечитать его, поскольку все параметры setcookie( ) были описаны выше.
Прежде чем следовать дальше, я попрошу вас перечитать следующую фразу не один и не два, а целых три раза. Значение cookie должно
устанавливаться до передачи в браузер любой другой информации, относящейся к странице. Напишите эту фразу 500 раз в тетрадке, сделайте
татуировку, научите своего попугая произносить эти слова — короче, проявите фантазию. Другими словами, значение cookie не может
устанавливаться в произвольном месте web-страницы. Оно должно быть задано до отправки любых данных в браузер; в противном случае
cookie не будет работать.
Есть еще одно важное ограничение, о котором также необходимо помнить, — вы не сможете создать cookie и использовать его на той же
странице. Либо пользователь должен вручную обновить страницу (хотя рассчитывать на это нельзя), либо вам придется подождать
следующего запроса этой страницы — и только после этого можно будет использовать cookie.
В следующем примере функция setcookie( ) используется для создания cookie с идентификатором пользователя:
$userid = "4139b31b7bab052";
$cookie_set = setcookie ("uid", $value, time()+3600, "/", ".phprecipes.com", 0);
Последствия создания cookie:
После перезагрузки или перехода на другую страницу становится доступной переменная $userid, содержащая идентификатор
4139b31b7bab052.
Срок действия cookie истекает ровно через один час (3600 секунд) после отправки. После истечения этого срока cookie становится
недействительным.
Доступ к cookie разрешен только из домена phprecipes.com.
Разрешен доступ к cookie через небезопасный протокол.
В следующем примере (листинг 13.1) cookie используется для хранения параметров форматирования страницы (в данном случае — цвета
фона). Обратите внимание: значение cookie задается лишь в результате выполнения действия, установленного для формы.
Листинг 13.1. Сохранение цвета фона, выбранного пользователем
// Если переменная $bgcolor существует
if (isset($bgcolor)) :
setcookie("bgcolor", $bgcolor, time()+3600);
?>
// Значение $bgcolor не задано, отобразить форму
else :
endif;
?>

При загрузке в браузер сценарий проверяет, было ли задано значение переменной $bgcolor. Если переменная существует, для страницы
выбирается цвет фона, определяемый переменной $bgcolor. В противном случае в браузере выводится форма HTML с предложением выбрать
цвет фона. После выбора цвета значение $bgcolor будет распознаваться при последующей перезагрузке той же страницы или при переходе к
другой странице.
Кстати говоря, имена cookie могут выглядеть как элементы массива. Вы можете использовать имена вида uid[1], uid[2], uid[3] и т. д., а затем
работать с ними, как с элементами обычного массива. Пример приведен в листинге 13.2.
Листинг 13.2.
setcookie("phprecipes[uid]", "4139b31b7bab052", time( )+3600); setcookie("phprecipes[color]",
"black", time( )+3600); setcookie("phprecipes[preference]", "english", timeO+3600);
if (isset($phprecipes)) :
while (list ($name, $value) = each ($phprecipes)) :
echo "$name = $value \n";
endwhile;
endif:
?>
В результате выполнения этого фрагмента будет выведен следующий результат (а на клиентском компьютере будут созданы три cookie):
uid = 4139b31b7bab052
color = black
preference = english
Хотя массивы cookie очень удобны для хранения всевозможной информации, следует помнить, что некоторые браузеры
ограничивают количество создаваемых cookie (например, Netscape Communicator разрешает создавать до 20 cookie на домен).
Cookie чаще всего применяются для хранения числовых идентификаторов (UIN), по которым в дальнейшем на сервере производится выборка
информации,
относящейся к данному пользователю. Этот процесс продемонстрирован в листинге 13.3, где UIN сохраняется в базе данных MySQL.
Сохраненные данные впоследствии используются для настройки параметров форматирования страницы.
Допустим, у нас имеется таблица userjnfo в базе данных с именем user. В ней хранятся следующие атрибуты пользователя: идентификатор, имя
и адрес электронной почты пользователя. Определение таблицы выглядит так:
mysql>create table user_info (
->user_id char (18),
->fname char(15),
->email char(35));
По сравнению с полноценными сценариями регистрации пользователя, работа листинга 13.3 начинается «на половине пути»: предполагается,
что данные пользователя (идентификатор, имя и адрес электронной почты) уже хранятся в базе данных. Чтобы пользователю не приходилось
вводить всю информацию заново, идентификатор (в листинге 13.3 для простоты он равен 15) загружается из cookie на клиентском компьютере.
Листинг 13.3. Загрузка информации пользователя из базы данных
if (! isset($userid)) :
$id = 15;
setcookie ("userid", $id, time( )+3600);
print "A cookie containing your userID has been set on your machine.
Please refresh the page to retrieve your user information";
else:
@mysql_connect("localhost", "web", "4tf9zzzf") or die("Could not connect to MySQL server!");
@mysql_select_db("user") or die("Could not select user database!");
// Объявить запрос
$query = "SELECT * FROM users13 WHERE user_id = '$userid'";
// Выполнить запрос
$result = mysql_query($query)l;
// Если совпадение будет найдено, вывести данные пользователя.
if (mysql_num_rows($result) == 1) :
$row = mysql_fetch_array($result);
print "Hi ".$row["?name"].", ";
print "Your email address is ".$row[ "email"];
else:
print "Invalid User ID!";
endif;
mysql_close();
endif;
?>
Листинг 13.3 показывает, как удобно использовать cookie для идентификации пользователей. Этот прием может использоваться в
разнообразных ситуациях, от автоматической регистрации пользователя на сайте до отслеживания пользовательских параметров настройки.
В следующем разделе приведен сценарии полной регистрации пользователя и последующего сохранения UIN в базе данных.
Функции MySQL, встречающиеся в листинге 13.3, были описаны в главе 11.
|