Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2010, 13:59   #1
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию Сессии

У меня тут запарка случилась с сессиями. Когда 1 сессию начинаю и завершаю её всё работает. Но когда начинаю другую(например вход под другим пользователем при этом сессию 1-го пользователя завершил), то 1 сессия чередуется со 2 сессией после обновления страницы. В добавок когда по очереди их ещё обе завершаешь, после обновления страницы ты можешь оказаться под 1 или 2 юзером или вообще без сессии. Я уже начал верить в паранармальное.
Начинаю сессию так:
$_SESSION['login']=$myrow2['login'];
$_SESSION['id']=$myrow2['id'];
$_SESSION['level']=$myrow2['level'];
Сессию завершаю так:
unset($_SESSION['id']);
unset($_SESSION['level']);
unset($_SESSION['login']);
session_destroy();
cheef вне форума Ответить с цитированием
Старый 19.12.2010, 14:27   #2
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Начинать нужно сессию так:

Код:
session_start();
и только после этого устанавливать параметры.

А для закрытия достаточно

Код:
session_destroy();
Причём, перед тем как начинать новую Вы должны закрыть уже запущенную сессию.

http://phpfaq.ru/sessions
Никки вне форума Ответить с цитированием
Старый 19.12.2010, 14:46   #3
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию

session_start(); - этот код стоит у меня на всех страницах сайта.
session_destroy(); - этот только на странице выхода.
Я так понимаю все session_start(); нужно заменить на:
if (isset($_REQUEST[session_name()])) session_start();
cheef вне форума Ответить с цитированием
Старый 19.12.2010, 15:02   #4
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Да, можно так.

Вот например как у меня:

Код:
if (isset($_REQUEST[session_name()])) 
{	
	session_start();
	if (!isset($_SESSION['user_id']) || $_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) session_destroy();
}
Тут сразу же проверка по IP, чтобы не так просто было украсть сессию.

Вот логин:

Код:
if (isset($_POST['login'])) 
{
	$name=mysql_real_escape_string($_POST['login']);
	$pass=mysql_real_escape_string($_POST['password']);
	$query = "SELECT * FROM `_users` WHERE login='$name' && pass='".md5(md5($pass))."'";
	$res = mysql_query($query);
	if ($res)
	{
		if (mysql_num_rows($res)==1)
		{
			if ($row = mysql_fetch_assoc($res)) 
			{
				session_start();
				$_SESSION['user_id'] = $row['id'];
				$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
				$_SESSION['u_type'] = $row['type'];
				$_SESSION['sid'] = $row['sub_id'];
				
				mysql_query("UPDATE `_users` SET `lastlogin` =  '".time()."', `lastip` = '$_SERVER[REMOTE_ADDR]' WHERE `id` = '$row[id]'");
			
				header("Location: http://".$_SERVER['HTTP_HOST']."/?module=main&e=2");
			}
		} else header("Location: http://".$_SERVER['HTTP_HOST']."/?module=main&e=1");
	} else header("Location: http://".$_SERVER['HTTP_HOST']."/?module=main&e=3");
	exit;
}
А в логауте так:

Код:
if (isset($_GET['action']) && $_GET['action']=="logout") 
{
	session_start();
	session_destroy();
	header("Location: http://".$_SERVER['HTTP_HOST']."/?module=main&e=4");
	exit;
}

Последний раз редактировалось Никки; 19.12.2010 в 15:11.
Никки вне форума Ответить с цитированием
Старый 19.12.2010, 16:24   #5
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию

Осталась та же проблема. Может это быть связанно с хостингом?
cheef вне форума Ответить с цитированием
Старый 19.12.2010, 17:01   #6
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Может быть. Попробуйте указать свою папку на сервере для хранения сессий.

в .htaccess php_value session.save_path "sessions/" (тут как то надо указать абсолуютый путь)
либо с помощью функции session_save_path($_SERVER[DOCUMENT_ROOT]."/sessions/");
либо так: ini_set('session.save_path', $_SERVER[DOCUMENT_ROOT]."/sessions/");

Разумеется в .htaccess нужно будет услановить Deny from all для папки sessions/

Последний раз редактировалось Никки; 19.12.2010 в 17:03.
Никки вне форума Ответить с цитированием
Старый 19.12.2010, 21:56   #7
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Это скорее связано с браузером (например, проблема наблюдается для FF всегда). Убивайте сессионные куки через JS.
Виталий Желтяков вне форума Ответить с цитированием
Старый 20.12.2010, 07:32   #8
cheef
Форумчанин
 
Регистрация: 16.03.2009
Сообщений: 205
По умолчанию

Я вообще без кук работаю или они сами создаются при начале сессии? Я просто про них ещё не читал.
cheef вне форума Ответить с цитированием
Старый 20.12.2010, 09:21   #9
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Куки если не запрещены создаются автоматически.
Виталий Желтяков вне форума Ответить с цитированием
Старый 20.12.2010, 11:32   #10
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Никки, а вот ip проверять если не тот то завершаем сессию и человеку обратно придется заходить под своим логином и паролем?
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сессии в сервлетах Musho Общие вопросы по Java, Java SE, Kotlin 1 19.10.2010 05:06
Сессии L_M PHP 3 06.06.2009 10:27
Сессии limon PHP 19 29.11.2008 22:46