Pers.narod.ru. PHP. Статьи. Делаем сессию на PHP - с листингом |
Итак, нам нужна сессия на PHP. Самый современный способ работы с ней - использование "суперглобального" массива $_SESSION, который не надо объявлять и данные которого недоступны методами GET или POST.
Ниже содержится листинг некоего файла index.php, содержащего форму для входа в сессию или же показывающего, что мы уже вошли.
<? require_once ("check.php"); session_start (); ?> <html> <head> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Сессии: демо</title> </head> <body bgcolor="#E5E5E5" text="#000000" link="#006699" vlink="#5493B4"> <? $login1 = check_user(); if (!empty($login1)) { print 'Вы вошли как '.$login1.'</span>'; print '<br><a href="index.php" target=_blank>Новое окно</a>'; print '<br><a href="logout.php">Выход</a>'; } else { ?> <form method="post" action="login.php"> <table width=100% align=center border=0> <tr><td><span class=postbody>Логин:</span></td> <td><input type=text size=8 maxlength=16 name=login></td></tr> <tr><td><span class=postbody>Пароль:</span></td> <td><input type=password size=8 maxlength=16 name=password></td></tr> <tr><td colspan=2 align=center><input type=submit value="OK"></td></tr> </table></form> <? } ?>
После нажатия кнопки ОК вызывается файл login.php, отвечающий за создание сессии:
<? function login ($login1, $password1) { $login = 'test'; //Здесь нужно вместо этих 2 действий найти в базе запись $password=md5('123');//с логином, равным $login1 if ("$login1" == "$login" and md5("$password1") == "$password") { return true; } return false; } $login=$password=''; if (isset ($_POST['login'])) $login=$_POST['login']; if (isset ($_POST['password'])) $password=$_POST['password']; if (login ($login,$password)) { session_start(); $_SESSION['test_inside']=1; $_SESSION['current_user']=$login; } header("Location: ".$_SERVER['HTTP_REFERER']); ?>
По ссылке "Выход" мы можем закрыть сессию, вызвав файл logout.php:
<? require_once ("check.php"); session_start (); $current_user=check_user(); if (!empty($current_user)) { $_SESSION = array(); session_destroy (); } header('Location: '.$_SERVER['HTTP_REFERER']); ?>
Включаемый файл check.php служит для проверки того, доступна ли сессия.
<? function check_user () { if (!isset($_SESSION['test_inside'])) return ''; else return $_SESSION['current_user']; } ?>
Строку current_user в реальном проекте следует заменить на какое-нибудь неудобоваримое имя, скажем, qghr43_wed3 (соответственно, имя переменной $current_user тоже заменится на $qghr43_wed3).
Открытие новых окон браузера сохранит сессию - она будет разрушена автоматически только при закрытии последнего окна.
Теперь любой модуль проекта может содержать код, выполняемый в зависимости от того, находимся ли мы в сессии.
<? require_once ("check.php"); session_start (); //... $login1 = check_user(); if (!empty($login1)) { //Код, доступный только для зарегистрированного пользователя } ?>
Следует понимать, что сессии не используют каких-то новых или особенных механизмов передачи данных. Таких механизмов
просто не существует. Либо передаются куки
(при настройке session.use_cookies=1
в файле php.ini
, принятой по умолчанию), либо ко всем формам "цепляется"
дополнительный параметр, так называемый идентификатор сессии
(если включена настройка session.use_trans_sid=1
), при этом "нормальная" ссылка вида
<a href="/index.php">Index</a>
превращается в страшное
<a href="/index.php?PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f">Index</a>
а к формам добавляется скрытое поле вида
<input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />
Поэтому при отключении кукизов в ряде браузеров могут не работать и сессии, а если использовать идентификатор сессии, ссылки становятся уникальными для каждого пользователя, так что обмениваться ими становится проблематично.
гостевая; E-mail |