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" />

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

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz