![]() |
![]() |
| http://kurepin.ru/php/slang.ru/13/ |
|
Строим сайт Глава 13. сессии Написав функцию user_access(), очень просится на свет функция user_login(), смысл которой должен быть понятен из названия - авторизация пользователя. Но прежде чем ее писать, давайте чуток порассуждаем о том, как мы будем авторизовывать пользователя и как хранить некоторые его (пользователя) особенности во время web-серфинга по сайту. Язык PHP имеет в своем арсенале замечательный механизм - сессии, который мы используем для обеспечения комфортабельной работы на нашем сайте. Про сессии уже было слишком много написано, чтобы сейчас разжевывать эту технологию, поэтому остановимся на главном, а детали можете изучить, например, здесь: http://php.spb.ru/php/session.html (копия). Суть работы PHP-сессий состоит в следующем: PHP различными способами (чаще всего через cookies) передает пользователю и получает обратно уникальный идентификатор, по которому пользователь (браузер) может быть узнан. В файле конфигурации PHP определено место, где под этим идентификатором сохраняются данные, относящиеся к данному пользователю. Набор и тип данных, хранящихся в сессии для каждого посетителя, определяется, разумеется, программистом. Вот и все, вкратце. Мы будем регистрировать сессии для пользователей, чтобы сохранять в них такие данные как: id пользователя, его имя, логин, email, выбранный язык интерфейса, предпочитаемый дизайн и другие данные, дергать которые из базы данных при отдаче очередной страницы одному и тому же пользователю - дело накладное. Поскольку в сессии мы собираемся хранить настройки интерфейса (скин, язык), то становится понятно, что сессия должна регистрироваться вначале каждой запрашиваемой страницы. Предлагаю разместить вызов сессии в начале файла init.class. Потом, может быть, вынесем сессии в отдельный файл, если у нас появятся html-страницы, в которых потребуются сессии, но не потребуются никакие классы. Пишем в начало файла init.class, до объявления класса: highlight_string(' unset($session); if(!$command_line) { session_set_cookie_params(0,\'/\',\'.slang.ru\'); session_start(); session_register(\'session\'); if(!isset($session[\'user_ip\'])) $session[\'user_ip\']=$_SERVER[\'REMOTE_ADDR\']; if(!isset($session[\'user_skin\'])) $session[\'user_skin\']=\'default\'; } ?>');?> Собственно, что я написал: сначала идет "защитная" команда unset($session), которая уничтожает переменную $session, если та была каким-то образом рождена; например, передана через URL, чтобы подсунуть нам ложные значения. Затем проверил на существование значения TRUE в переменной command_line. По умолчанию такой переменной вообще нет. Но когда мы начнем вызывать наши скрипты из командной строки, эту переменную надо будет установить в TRUE, чтобы не производить регистрацию сессии в условиях, непригодных для этого. Далее следует директива, которая, если я не ошибся в написании, должна продиктовать вашему браузеру примерно следующее: храните, уважаемый браузер, куку с ID сессии до закрытия всех своих окон и имейте ее в виду для всех сайтов в домене *.slang.ru. session_start() - это мы активируем механизм сессий. session_register('session') - регистрируем переменную $session, содержимое которой будет храниться в сессии. То есть, если пользователь, обратившийся на сайт, был узнан, то для него переменная $session автоматически заполняется теми данными, которые в ней были в момент последнего обращения пользователя к сайту.
Я создал две тестовые страницы: на разместилась форма для сохранения email-адреса в массиве $session, а на - вывод содержимого этого массива. и Как видите, наши несколько строк текста в начале файла init.class делают свое дело - данные о пользователе сохраняются на сервере в формате php-сессий. Весьма, весьма удобная вещь - сессии. Кстати, их отличительная особенность - почти неограниченный объем хранимых данных, в отличие от cookies. По традиции привожу тексты тестовых страниц. директория /test/session_set, файл brain.php:
highlight_string('
require(preg_replace(\'/www$/i\',\'/req\',$_SERVER[\'DOCUMENT_ROOT\']).\'/init.class\');
// создаем экз. класса
$my=new class_init;
// определяем переменные
$title=\'slang.ru: тестирование сессий\';
$stomach=\'stomach.php\';
include($my->path_inc.\'/main.php\');
?>');?>
директория /test/session_set, файл stomach.php:
highlight_string('
После нажатия на [сохранить] будет произведена попытка записать email в сессию, чтобы затем получить все данные сессии на странице ../session_report. if(isset($test)) {?>
Записываем данные в сессию...
$session[\'user_email\']=$email; ?> адрес \'=$session[\'user_email\']?>\' в сессию записан! [проверить] }?> ');?> директория /test/session_report, файл brain.php:
highlight_string('
require(preg_replace(\'/www$/i\',\'/req\',$_SERVER[\'DOCUMENT_ROOT\']).\'/init.class\');
// создаем экз. класса
$my=new class_init;
// определяем переменные
$title=\'slang.ru: тестирование сессий\';
$stomach=\'stomach.php\';
include($my->path_inc.\'/main.php\');
?>');?>
директория /test/session_report, файл stomach.php:
highlight_string('проект slang.ru
my session: user_email: =$session[\'user_email\']?> user_ip: =$session[\'user_ip\']?> user_skin: =$session[\'user_skin\']?> ');?> Вняли? Тогда двинемся дальше... 16.08.04 |
| реклама на сайте | ||||
|
| copyright ©2000-2002 Ruslan Kurepin |