Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php / Lab9.doc
Скачиваний:
38
Добавлен:
07.02.2016
Размер:
94.72 Кб
Скачать

Лабораторная работа №9 работа с сессиями

1. Зачем нужны сессии?

Одна из самых важных веб-технологий - это сессии.

Будем считать, что ваш сервер настроен по умолчанию (файл php.ini) и в файлахhttpd.confили .htaccessне вносили ничего для утановки локальныхphp-настроек (локальных - для каталога и его подкаталогов).

Когда нам нужны сессии?

Ответить на этот вопрос проще ответом на другой вопрос: что мы хотим для удобной работы в PHP?

Представьте программу тестирования людей. Есть куча вопросов и куча людей. Надо постараться, чтобы люди:

1. Получали вопросы в случайном порядке (чтобы у соседа по классу вопросы появлялись в другом порядке).

2. Не могли отвечать на вопросы в произвольном порядке (меняя какие-то параметры в URL) или еще хуже - подделать кол-во набранных балов или узнать правильный ответ.

3. Не могли бросить тест и начать его заново (можно лишь дорешать до конца).

4. Могли вернуться и продолжить тестирование при разрыве связи с сервером (модем повесил трубку).

5. Не обязаны были бы регистрироваться.

6. Могли бы работать все через один прокси сервер и с отключенными куками.

и т.д. еще можно много полезного придумать.

В такой задаче надо перед началом прохождения теста взять все номера вопросов, перемешать между собой и сохранить в область данных посетителя массив номеров. Затем поместить в туже область флаг (flag=тестирование), чтобы человек не мог перейти на начало теста (начать его заново), не прорешав тест до конца. Это сделать очень просто. Предположим, чтоindex.php- это главная страница для старта,vopros.php- страница, где выдадут очередной вопрос. Если человек с флагом "тестирование" попытается перейти наindex.php, то ему надо написать - "Вы не закончили тестирование". Если человек обиделся, выключил компьютер и ушел спать, через некоторый тайм аут (к примеру, через 3 дня), надо записать в историю прохождения тестов: "брошенный тест". Это похоже на игру через Интернет - если человек проигрывает, но не хочет признать это, он может как бы потерять связь с игровым сервером (якобы модем повесил трубку).

Как это все реализовать? Очень просто. Предположим, что у каждого посетителя есть некая область памяти (у каждого - своя), в которую наша программа может что-то записывать и читать. Эта область памяти должна соответствовать всем требованиям, которые мы выдвинули выше. Наша программа не должна заботиться о ней. И все это можно сделать. Эта абстрактная область памяти имеет идеальный интерфейс. Вернее, не имеет его. К примеру, если бы данная область хранилась в файлах, нам надо было бы файлы читать и анализировать. Для записи - надо было бы записывать туда данные в каком-то формате. При хранении в базе данных нам пришлось бы в начале программы выполнять SQL-запрос, чтобы извлечь все данные и в самом конце выполнения программы записать их обратно. Все это (затраты на чтение файла или базы данных) называется интерфейс. Наше же общение с областью памяти вообще не имеет интерфейса. Это значит, что любые переменные, которые мы пожелаем, будут с некоторого момента считаться областью памяти посетителя. При каждом запуске программы от разных посетителей она будет иметь доступ через какие-то переменные только к персональным настройкам. Чтобы сохранить (закрепить) у пользователя какую-либо информацию в переменной, надо просто записать в эту переменную что-нибудь. К примеру, в программе авторизации пользователей, говорим "хочу, чтобы $authстала частью области памяти". Если человек вводит свой логин и пароль (их мы проверяем как-то, например по базе данных), то мы записываем в переменную $authединичку, затем в аналогичную переменную $loginего логин. Пароль записывать не надо, т.к. наличие единицы в переменной $authуже будет означать, что человек прошел авторизацию. На всякий случай будем хранить еще и логин. Пароль хранить совершенно не нужно, т.к. нет случая его применить... кроме как вывести на экран (но это уже будет глупая затея, а не реальная программа). Таким образом, мы один раз устанавливаем $auth, а дальше в любом месте может проверить авторизированность пользователяif($auth) илиif($auth==1). Так как переменная $authбудет частью области памяти, то можно не бояться, что какой-нибудь хакер запустит нашу программу какprogramm.php?auth=1 и окажется авторизированным.

Подведем итог. Все, о чем тут было сказано, как не трудно догадаться, называется сессия.

Принцип действия следующий. Чтобы сохранить о пользователе что-то, выберем для этого переменную и сообщим php-процессору о нашем желании с помощьюsession_register("auth") иsession_register("login"). Это называется регистрация переменной. Эти строчки пишут в начале программы, чтобыPHP-код, идущий ниже в программе, мог обращаться к $authи $login.

Если мы что либо запишем в $authи/или $login, то эта переменная будет сохранена в персональную область данных посетителя. Это значит, что при следующем вызове той же программы (или из того же каталога или подкаталогов), перед началом работыphp-скрипта,php-процессор узнает пользователя и загрузит сохраненные для него переменные (если когда-либо в них что-то записывалось).

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

Еще раз подведем итог. Мы хотим, чтобы PHP-процессор умел распознавать пользователей и предоставлял в свободное распоряжение программе область памяти (в виде переменной $auth, $loginили $любое_название), которую невозможно никак подделать. Всех новых пользователейPHP-процессор тоже должен распознавать и присваивать им новую область памяти. Единственное, что сможет злой пользователь – прикинуться новым пользователем или вообще бросить наш сайт.

Соседние файлы в папке php