А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/slang.ru/13/
Rambler's Top100
Строим сайт slang.ru, глава 13

Строим сайт slang.ru

Глава 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, до объявления класса:

<? 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 автоматически заполняется теми данными, которые в ней были в момент последнего обращения пользователя к сайту.

Обратите внимание (распространенная ошибка): регистрация переменной в сессии производится без префикса "$"!
Ну а дальше идет проверка на существование и заполнение двух ячеек массива $session - user_ip и user_skin. Я их пока добавил для примера, так что давайте сразу проверим как это все хозяйство у нас работает.

Я создал две тестовые страницы: на первой разместилась форма для сохранения email-адреса в массиве $session, а на второй - вывод содержимого этого массива.

http://13.tutorial.slang.ru/test/session_set/

и

http://13.tutorial.slang.ru/test/session_report/

Как видите, наши несколько строк текста в начале файла init.class делают свое дело - данные о пользователе сохраняются на сервере в формате php-сессий. Весьма, весьма удобная вещь - сессии. Кстати, их отличительная особенность - почти неограниченный объем хранимых данных, в отличие от cookies.

По традиции привожу тексты тестовых страниц.

директория /test/session_set, файл brain.php:

<?  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:

<div align=left> <form action="./" method="post"> Ваш email:<br> <input type="text" name="email"><input type="submit" name="test" value="сохранить"><br> </form> <br> После нажатия на [сохранить] будет произведена попытка записать email в сессию, чтобы затем получить все данные сессии на странице <a href=../session_report>../session_report</a>.<br> <br>  </div> <br><br><br><br> <? if(isset($test)) {?> <div align=center> <b>Записываем данные в сессию...</b><br> </div> <br> <br> <? $session['user_email']=$email; ?> адрес '<?=$session['user_email']?>' в сессию записан!<br> <br> <br> [<a href=../session_report/>проверить</a>]<br> <br> <?}?> <br><br><br><br><br>


директория /test/session_report, файл brain.php:

<?  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:

проект <b>slang.ru</b> <br><br><br><br> my session:<br> <br> user_email: <?=$session['user_email']?><br> user_ip: <?=$session['user_ip']?><br> user_skin: <?=$session['user_skin']?><br> <br><br><br><br><br><br><br><br><br>

Вняли? Тогда двинемся дальше...





[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin