ГЛАВА 13. Cookie и отслеживание сеанса
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);
?>
<html>
<body bgcolor="<?=$bgcolor:?>">
<?
// Значение $bgcolor не задано, отобразить форму
else :
<body bgcolor="white">
<form action="<? print $PHP_SELF; ?>
method=="post">
What's your favorite background color?
<select name="bgcolor">
<option value="red">red
<option value="blue">blue
<option value="green">green
<option value="b1ack">black
</select>
<input type="submit" value="Set background color">
</form>
<?
endif;
?>
</body>
</html>
При загрузке в браузер сценарий проверяет, было ли задано значение переменной $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<br>\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"].",<br>";
print "Your email address is ".$row[ "email"];
else:
print "Invalid User ID!";
endif;
mysql_close();
endif;
?>
Листинг 13.3 показывает, как удобно использовать cookie для идентификации пользователей. Этот прием может использоваться в разнообразных ситуациях, от автоматической регистрации пользователя на сайте до отслеживания пользовательских параметров настройки.
В следующем разделе приведен сценарии полной регистрации пользователя и последующего сохранения UIN в базе данных.
Функции MySQL, встречающиеся в листинге 13.3, были описаны в главе 11.
Назад |
Содержание раздела |
Общее Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|