|
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" />
Поэтому при отключении кукизов в ряде браузеров могут не работать и сессии, а если использовать идентификатор сессии, ссылки становятся уникальными для каждого пользователя, так что обмениваться ими становится проблематично.
|
|