Как открыть в php новое окно, создать для него новую сессию, но не убить старую

encyclop

Guest
Как открыть в php новое окно, создать для него новую сессию, но не убить старую

Здравствуйте!

Вопрос такой: как открыть в php новое окно, создать для него новую сессию, но не убить старую сессию для предыдущего окна?

При открытии нового окна браузера в рамках текущей сессии никак не удается создать вторую сессию. Данные для второй сессии просто переписывают значения первой.

Скажем, сделал...

session_register($sessName);

Присвоил ей значения

$_SESSION['id'] = '1';
$_SESSION['username'] = 'qu';
$_SESSION['group'] = 'admin';
и так далее...

Нужно создать вторую сессию наравне с первой, но при попытке...

session_register($sessName2);

$_SESSION['id'] = '2';
$_SESSION['username'] = 'nequ';
$_SESSION['group'] = 'user;
и так далее...

И закрыть старую сессию нельзя: может понадобиться.
И новая нужна...

Ясно, что у сессий есть четкая привязка к браузеру.

Но как же тогда с юзерами, которые открывают новые окна и одновременно создают в их рамках разные сессии?
 

Serguitar

Новичок->продвинутый
session_register($sessName2);

$_SESSION['id[$i]'] = '1';
$_SESSION['username[$i]'] = 'qu';
$_SESSION['group[$i]'] = 'admin';
 

encyclop

Guest
Прочитал... и не только про это (да и не только там)...

Признаюсь: грешен.

В этом смысле, сессию можно создать и без обращения к $_SESSION, но при включенных register_globals

session_name('UI');
session_start();

$fv = 'first var';
$sv = 'second var';

session_register("fv", "sv");

var_dump($_SESSION);

А сессьён регистьер никакую сессию не регистрирует: она просто делает глобальными в рамках сессии ряд необходимых переменных, то есть session_register($sessName2);, как и session_register($sessName);, кажутся явно излишними, ненужными.

Однако при всем просвещенном обскурантизме ответственно заявляю: проблема не решена.

Если попытаться сделать так...

session_name('UI');
session_start();

$fv = 'first var';
$sv = 'second var';

session_register("fv", "sv");

var_dump($_SESSION);

session_name('MI');
session_start();

$tv = 'third var';
$f2v = 'forth var';

session_register("tv", "f2v");

var_dump($_SESSION);

Появится вполне резонный мессидж (с точки зрения ПХП, разумеется):

Notice: A session had already been started - ignoring session_start() in z:\home\mediasite\www\price\test.php

То есть session_start() открывает/продолжает режим сессии только для текущей сессии.

Гарантия начала новой означает закрытие текущей (session_destroy();).

Итак, логика сессьённого ПХП зиждется на трех столпах:

- PHP checks whether a valid session ID exists.
- If there is no session ID, PHP creates a new ID.
- If a valid ID exists, the frozen variables of that session are reactivated and introduced back to the global namespace.

Однако чем объяснить мирное сосуществование сразу нескольких сессий, открытых разными или пусть даже одним юзером в рамках одной и той же программы? - Новизной открытого окна браузера, его, так сказать, девственной чистотой?

НО почему, о Боже, почему нельзя сохранить треклятую сессию юзера, во время которой мы пытаемся создать новую сессию в новом окне (header("Location: newfile.php");)? Почему нужно обязательно session_destroy();, а лишь потом session_name();, session_start();...

Как перепрыгнуть из прежней жизни в новую, не уничтожив за собой мосты? Как уподобиться юзеру, весело и без проблем открывающему новые окна и создающему новые сессии в разных окнах одной и той же программы?

-~{}~ 31.10.04 02:36:

Serguitar, боюсь, ваш/твой вариант не походит: сессия остается одной, просто список ее глобальных переменных становится, так сказать, сложно структурированным...

Закроешь сессию в одном из окон (под одним из пользователей) - закроешь ее для всех юзеров, под которыми ты зашел.
 

encyclop

Guest
Спасибо, прочитал.

Получается, мне нужно, чтобы в определенный момент сессии юзер мог бы открыть новую сессию в новом окне браузера, но это не получается - как только пишешь там session_start() - возвращаются все прежние данные сессии. Пытаешься писать перед session_start() session_name() - сессия просто переименовывается.

Как очистить куки для нового окна браузера, чтобы там была создана действительно новая сессия?

Я так понимаю, можно отключить поддержку кук для сессии, чтобы SID передавался по ссылке, и сделать редирект header"Location: newfile.php" (для него, как писалось в этой статье, SID автоматом не подставляется). Следовательно, это будет новое окно с отключенными куками и действительно новой сессией... А? Что думаете?
 

encyclop

Guest
ОГРОМНОЕ спасибо за ссылку: что называется, в тему.

Еще больше убедился, что наиболее эффективно сделать это можно только одним способом:

- поставить в php.ini session.use_cookies = 0 (то есть перейти исключительно на session.use_trans_sid = 1)
- при новом логине обращаться к спецстранице-1, где на основании данных по текущей сессии проверяется, имеет ли юзер право заходить под другим юзером... И если имеет,..
- вносить запись в спецтаблицу по сессиям в формате

ID сессии (обычный автоинкерементируемый номер записи)
ID userа, который входит (для данной задачи не нужно, но может пригодиться для такой статистики)
ID userа, под которым надо зайти
Зашли ли - boolean (пока '0')
Дата и время захода (пока '0000-00-00 00:00:00')
Дата и время выхода (пока '0000-00-00 00:00:00', может быть, навсегда)

- обратиться к спецстранице-2 и послать ей гетом всего один параметр - номер сессии из таблицы сессий

header("Location: spec2.php?proof=$id");

Обратим внимание, что при таком раскладе SID новой странице не передается...

- в спецстранице-2

Открывает session_start();
Делаем всякие проверки на proof (!empty(), is_numeric());
Получаем запись с этим ID;
Проверяем, существует ли, зашли ли;
Если существует и не зашли, обновляем запись и пишем, что зашли и ставим текущую дату и время захода;
Наконец, ЗАХОДИМ.

И при этом сессия админа, из-под которого мы зашли, ВАЛИДНА!!!

УРА!!!

Всем БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО (особенно Санитару)!

P. S.

При выходе тоже можно писать время выхода, но только если чел нажал на ссылку для выхода, а не закрыл браузер. ОБЫДНО...
 
Сверху