Выход из сессии

Статус
Закрыто для дальнейших ответов.

pcheliakov

Member
Регистрация
06.09.2010
Сообщения
17
Этот код у меня авторизация к админке. файл lock.php
Код:
<?php

session_start();

require_once('blocks/db_login.php');

if(empty($_SESSION['user_id']))
{
 if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']))
 {
  header('WWW-Authenticate: Basic realm="Member Area"');
  header("HTTP/1.0 401 Unauthorized");
  echo "<p style='color: red; font: bold 20px verdana; margin: 30px 0 0; padding: 0px; text-align: center;'>Введите имя пользователя и пароль</p>";
  exit;
 }
 else
 {
  require_once('blocks/db.php');
  
  $web_username = mysql_real_escape_string($_SERVER['PHP_AUTH_USER']);
  $web_password = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
  
  //составляем запрос к базе данных
  $query = "SELECT * ";
  $query .= " FROM userlist WHERE ";
  $query .= " username='".$web_username."' AND password=md5('".$web_password."')";
  $query .= " LIMIT 1";

  //запрос к базе данных на выборку
  $result = mysql_query($query,$db);
  
  if (!$result)
  {
   die ("Невозможно исполнить запрос к базе данных: <br/>". mysql_error());
  }
  else
  {
   if(!$myrow = mysql_fetch_array ($result, MYSQL_ASSOC))
   {
    header('WWW-Authenticate: Basic realm="Member Area"');
    header("HTTP/1.0 401 Unauthorized");
    echo "<p style='color: red; font: bold 20px verdana; margin: 30px 0 0; padding: 0px; text-align: center;'>Введены неверные имя пользователя и пароль!</p>";
    exit;
   }
   else
   {
    $message = "<p style='text-align: center;'>Добро пожаловать<br/><font color='#F68121' size='4'>".$myrow['last_name']." ".$myrow['first_name']."</font></p>";
    $_SESSION['user_id'] = $myrow['user_id'];
    $_SESSION['username'] = $myrow['username'];
   }
  }
 }
}
else
{
 require_once('blocks/db.php');

 //составляем запрос к базе данных
 $query = "SELECT * ";
 $query .= " FROM userlist WHERE ";
 $query .= " user_id=".$_SESSION['user_id'];
 $query .= " LIMIT 1";

 //запрос к базе данных на выборку
 $result_auth = mysql_query($query,$db);
 if (!$result_auth)
 {
  die ("Невозможно исполнить запрос к базе данных: <br/>". mysql_error());
 }
 else
 {
  while($row_auth = mysql_fetch_array($result_auth, MYSQL_ASSOC))
  {
   $message = "<p style='text-align: center;'>Добро пожаловать<br/><font color='#F68121' size='4'>".$row_auth['last_name']." ".$row_auth['first_name']."</font></p>";
  }
 }
}
?>
он подключён ко всем страницам сайта
Код:
<?php
 require_once("lock.php");
?>
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head> и т.д..
Сделана ссылка на выход из сессии. на файл exit.php
Код:
<?php
 require_once("lock.php");

 if(isset($_SESSION['user_id']))
 {
  if($_SESSION['user_id'] == '')
  {
   //echo "user_id пуст";
  }
  else
  {
   //echo "user_id не пуст";
   unset($_SESSION['user_id']);
   
   if(!isset($_SESSION['user_id']))
   {
    //echo "<br/>user_id не существует";
    
    if(isset($_SERVER['PHP_AUTH_USER']) || isset($_SERVER['PHP_AUTH_PW']))
    {
     //echo $_SERVER['PHP_AUTH_USER']."<br/>";
     //echo $_SERVER['PHP_AUTH_PW'];
     unset($_SERVER['PHP_AUTH_USER']);
     unset($_SERVER['PHP_AUTH_PW']);
    }
    if(isset($_SERVER['PHP_AUTH_USER']) || isset($_SERVER['PHP_AUTH_PW']))
    {
     //echo "Они ещё существуют";
    }
    else
    {
     //echo "Они удалены";
     //$_SERVER["PHP_AUTH_USER"] == '';
     //$_SERVER["PHP_AUTH_PW"] == '';
     session_destroy();
     unset ($_SESSION['user_id']);
     if(is_null($_SESSION['user_id']))
     {
      header ("location: index.php");
      exit();
     }     
    }
    
   }
  }
  
 }
 else
 {
  //echo "user_id не существует";
 }

?>
Я так понимаю что нажав на выход я должен вернуться на страницу index.php и попасть опять на регистрацию. Но почему-то у меня сессия не завершается. И выход не производится. Такое ощущение что не работает session_destroy();
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
session_destroy();
Это поставьте в файле exit.php после строчки require_once("lock.php");
И вообще, зачем использовать unset ($_SESSION['user_id']); если ещё использована и session_destroy();?
На сколько я знаю - unset - расформироувает переменную, а session_destroy(); разрушает всю сессию и её данные... Поэтому, если использовать session_destroy();, то unset для сессий, думаю, что не нужна...

P.S И кстати, забыл добавить, что сессия не работает ,,сразу,,. Даю пример:
Файл с выходом:
Код:
session_destroy();
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST']);}
Вас не переадресует на главную, хотя и сессия будет разрушена, т.к СЕССИЯ срабатывает только после обновления страницы. И будет написано что сессия ещё существует, а вот если обновить страницу ещё раз, то переадресует на главную. Поэтому если человек нажал ссылку выход, проще написать ему, что спасибо за то что вы с нами, заходите ещё, и поставить ссылку на главную...
 

ArhAngel

Well-Known Member
Регистрация
07.05.2011
Сообщения
378
Код:
session_destroy();
Это поставьте в файле exit.php после строчки require_once("lock.php");
И вообще, зачем использовать unset ($_SESSION['user_id']); если ещё использована и session_destroy();?
На сколько я знаю - unset - расформироувает переменную, а session_destroy(); разрушает всю сессию и её данные... Поэтому, если использовать session_destroy();, то unset для сессий, думаю, что не нужна...

P.S И кстати, забыл добавить, что сессия не работает ,,сразу,,. Даю пример:
Файл с выходом:
Код:
session_destroy();
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST']);}
Вас не переадресует на главную, хотя и сессия будет разрушена, т.к СЕССИЯ срабатывает только после обновления страницы. И будет написано что сессия ещё существует, а вот если обновить страницу ещё раз, то переадресует на главную. Поэтому если человек нажал ссылку выход, проще написать ему, что спасибо за то что вы с нами, заходите ещё, и поставить ссылку на главную...

По поводу последних строчек - можно как раз сделать unset($_SESSION['id']);
 

pcheliakov

Member
Регистрация
06.09.2010
Сообщения
17
Вот этот код ведь должен работать? Понятно что тут много лишнего кода и можно потом его удалить.
А у меня не работает.
Нужно чтобы после ссылки <a href>Главная</a> я попадал на админку на index.php опять на авторизацию как в первый раз со вводом логина и пароля. И кстати надо всё-же удалять $_SESSION['user_id'] а то там код не работает.
А я захожу на неё без авторизации. Я же удаляю $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW']. Что-то я совсем запутался. У меня что сессия на закрывается?

Код:
<?php
	require_once("lock.php");
	session_destroy();
	unset($_SESSION['user_id']);
	unset($_SERVER['PHP_AUTH_USER']);
	unset($_SERVER['PHP_AUTH_PW']);
	if(!isset($_SESSION['user_id']) || (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])))
	{
		$messag = "<p style='color: red; font: bold 20px verdana; margin: 30px 0 0; padding: 0px; text-align: center;'>Вы вышли из админки</p>";
	}
?>
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>Выход из Админки</title>
	<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
	<style>
		* {margin: 0px; padding: 0px;}
		a {color: #F68121; text-decoration: none; border-bottom-style: dashed; border-bottom-width: 1px;}
		a:hover {color: red;}
	</style>
</head>
<body>
	<?php
		echo $messag."<br/>";
		echo "<p style='text-align: center; font: bold 14px verdana;'><a href='http://".$_SERVER['HTTP_HOST']."/avangard.ru'>Главная</a></p>";
	?>
</body>
</html>
 

ArhAngel

Well-Known Member
Регистрация
07.05.2011
Сообщения
378
Код:
if(!isset($_SESSION['user_id']) || (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])))
        {
                $messag = "<p style='color: red; font: bold 20px verdana; margin: 30px 0 0; padding: 0px; text-align: center;'>Вы вышли из админки</p>";
        }
этот код не бует работать если вы не сделаете unset($_SESSION); (можно и так)
 

pcheliakov

Member
Регистрация
06.09.2010
Сообщения
17
Вообщем я понял что сделать выход из basic-аутентификации корректно не получится. Дело в том что я удаляю эти переменные ($_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW']) только на время сеанса исполнения скрипта. При повторном обращении, браузер (который запоминает введенные значения и хранит их до закрытия) передаст эти данные снова.
Буду делать обычную post-форму.

Только тогда возникает вопрос для чего нужна эта basic-аутентификация если выйти из неё корректно нельзя? Где она используется? И где пожно прочитать про эту проблему? Может вы что-нибудь расскажите?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
session_destroy();
Это поставьте в файле exit.php после строчки require_once("lock.php");
И вообще, зачем использовать unset ($_SESSION['user_id']); если ещё использована и session_destroy();?
На сколько я знаю - unset - расформироувает переменную, а session_destroy(); разрушает всю сессию и её данные... Поэтому, если использовать session_destroy();, то unset для сессий, думаю, что не нужна...

P.S И кстати, забыл добавить, что сессия не работает ,,сразу,,. Даю пример:
Файл с выходом:
Код:
session_destroy();
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST']);}
Вас не переадресует на главную, хотя и сессия будет разрушена, т.к СЕССИЯ срабатывает только после обновления страницы. И будет написано что сессия ещё существует, а вот если обновить страницу ещё раз, то переадресует на главную. Поэтому если человек нажал ссылку выход, проще написать ему, что спасибо за то что вы с нами, заходите ещё, и поставить ссылку на главную...

По поводу последних строчек - можно как раз сделать unset($_SESSION['id']);
Согласен, если в сессию заносится только id :)

Нужно чтобы после ссылки <a href>Главная</a> я попадал на админку на index.php опять на авторизацию как в первый раз со вводом логина и пароля. И кстати надо всё-же удалять $_SESSION['user_id'] а то там код не работает.
Если уж так нужна переадресация, то можно сделать через мета-тег:
Код:
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=site.ru">
Прописывать это надо между <head> и </head>
site.ru - арес сайта или нужная страница сайта...

А лучше бы вы сделали обычную авторизацию с сессиями, что то типа этого:
страница autorization.php
Код:
<?
//Страница для авторизации
session_start();
if(isset($_POST['go']) && $_POST ['login']!=='' && $_POST ['pass']!==''){
$_login = mysql_real_escape_string($_POST ['login']);
$_password = mysql_real_escape_string($_POST ['pass']);
$nme = mysql_query("SELECT `id` FROM `$userstable` WHERE `login` = '$_login' AND `pass` = '$_password'");
if(mysql_num_rows($nme)==1) {
$_SESSION['id'] = mysql_result($nme,0);
echo 'Вы успешно вошли!<br><a href="secret.php">Скрытая страница</a>';
}
else{echo 'Логин или пароль введены неверно!';}
}
else{
if(!isset($_SESSION['id'])) {echo '<b>Вы НЕ авторизованы!</b><br>';} else{echo 'Вы авторизованы!<br>';}
echo 'Авторизация:<br><form action="" method="post"> Логин: <br><input size="15"  maxlength="15" name="login"><br>
Пароль:<br> <input type="password" size="15"  maxlength="15" name="pass"><br><input type="submit" name="go" value="Войти"></form>';
}
?>
страница secret.php
Код:
<?
session_start();
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST']);}
echo 'Вы - авторизованный пользователь! И это скрытая страница! <br> Страница для выхода:<br> <a href="exit.php">Выход</a>';
?>
страница exit.php
Код:
<?
session_start();
session_destroy();
echo 'Вы успешно вышли! Приходите ещё!<br><a href="autorization.php">Перейти</a><br> Если всё нормально работает, то на странице autorization.php должно быть написано, что Вы не авторизованы!';
?>
Теперь что бы сделать некоторые страницы видеть могли только авторизованные люди, достаточно вписать строчку в них:
Код:
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST']);}
Или создать отдельный файлик пхп и подключать его ко всем ,,скрытым,, страницам...
 
Статус
Закрыто для дальнейших ответов.
Верх Низ