Как перебрать переменные в сессии?

Green Lord

Читатель
Как перебрать переменные в сессии?

Доброго времени.

Есть сессия. В ней хранится некоторое количество некоторых переменных (названия переменных не известны).

Вопрос: как перебрать все переменые сессии, получив их в виде
название_переменной=значение_переменной

?
 

tony2001

TeaM PHPClub
$HTTP_SESSION_VARS - там они все и лежат как элементы.
Green, ты меня удивляешь!
 

Green Lord

Читатель
Да, но там или нужна какая-то настройка, или так сделать нельзя.

Вот так не работает:

global $HTTP_SESSION_VARS;
reset ($HTTP_SESSION_VARS);
while (list($key, $val)=each($HTTP_SESSION_VARS)) echo("$key=$val<BR>");


Не работает потому, что прежде, чем обратится к $HTTP_SESSION_VARS["имя_переменной"], надо вначале сделать session_register("имя переменной"). А я этого имени не знаю
 

DiMA

php.spb.ru
Команда форума
открой файл сессии и сделай unserialize над содержимом (написано в ФАКе, его читать надо _до_ вопросов)

но скорее всего, есть способ проще...
 

Green Lord

Читатель
DiMA, не тыкайте меня, пожайлуста, носом в ФАК. Я вас, кажется, не оскорблял, и веду себя корректно (поправьте меня, если я ошибаюсь).

Или нет, ткните меня в ФАК, но только в том случае, если там - решение заданного вопроса.

Предложенный Вами вариант не то что исходной проблемы не решает - нет, более того, он имеет к ней очень косвенное отношение (обьяснять, почему?).



Ребята, все же - имеет моя проблема решение?
 

DiMA

php.spb.ru
Команда форума
Если вашей светлости оскорбительно рабочее обращение на ТЫ, тогда следует писать лицензионное соглашение на постинг в топик. Кстати, слов "тыкать" и "нос" я не употреблял =) (впрочем, навязчивые идеи обсуждают в форумах, связанных с медициной). Кстати, следующий шаг, когда нет аргументов, а хочеться убедить собеседника в правоте - указать на не знание русскава язика (и т.д.) - не утруждайтесь (это оффтоп).

Теперь о сути проблемы, для тех, кто не понимает ответов на вопрос (если знать заранее, что ответ не нужен - нафиг тогда его писать?). Итак, есть ИД сессии. Наверно есть простой способ, типа HTTP_SESSION_VARS, но ваша светлость забила на поиск в мане этого решения. Ну, предположим, что действительно до регистрации нельзя узнать имя и других способов нет (я лично не знаю и читать ман не буду - мне это не нужно). Тогда есть метод грубой силы. Элементарный и описанный в факе. Куда я тыкаю *мышку* :), чтобы не цитировать себя.

------------

Как устроены сессии: сериализация

Если вы посмотрите на файл сессии (где он находиться - узнаете позже), то увиде нечто такое:
myarray|a:4524:{s:7324:"startup";i:98;s:4:"type";i:1;s:2:"ip";s:13:"1572342";s
:2:"tt";i:2;s:3:"b";i:12312;s:621:"max";i:2380;s:6:"min";i:-8334;s:10:"realmax
";i:1213126;s:10:"realmin";i:0;s:1:"kol";i:1;s:1:"n";i:15;s:9:"timestart";i:98
8387008;s:7:"timeend";i:9883218;s:4:"list";a:16:{i:0;s:7:"1002001";i:1;s:7:"10
02007";i:2;s:7:"1002010"; ............ и т.д.

Представьте, у нас есть огромный массив сложной структуры, к примеру, $myarray. Вам будет интересно узнать, что любую перменную (сложный массив) с любыми символами (произвольные бинарные данные) очень легко запаковать в строку из букв и цифр. Для чего переводить массив в строку? Строку (просто переменная), да еще и текстовую, легко куда-нибудь записать. Например, на листочек бумаги. Или в базу данных... Или в файл сессии. Позже, можно распаковать такую строку в оригинальную переменную и получить то, что было до упаковки. Данный метод (называется - сериализация) упаковки/распокавки переменных или объектов применяется не только в сессиях. Просто PHP, чтобы сохранить все данные пользователя, запаковывает их и кладет как строку в файл сессии.

$myStr=serialize($myVar) - запаковать огромный массив или любую произвольную переменную $myVar в текстовую переменную $myStr.

$myVar=serialize($myStr) - распаковать (восстановить) данные из ранее запакованной переменной, хранящейся в $myStr, и записать результат распаковки (оригинальную переменную) в $myVar

-----------

сноска "узнаете позже":

-----------

session_save_path(), session.save_path

Получить или установить каталог, в котором будут храниться файлы сессии. $path=session_save_path() - получить. session_save_path("/mydir/temp"); - установить. Параметр session.save_path можно задавать в php.ini или .htaccess.

------------


После прочтения должен возникнуть только один вопрос. А что, если переменных более одной штуки (в примере описано только про 1 переменую, хоть и любой сложности)? Как тогда прочитать файло? Вот это не знаю. Влом проверять. Но наверно, элементарно просто (наверно, по переменной на строку..). Если ваша светлость не поймет и выскажет _единственный_ резонный упрек - я попробую помочь.

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

Green Lord

Читатель
DiMA - примите мои искреннии извинения (расшаркиваясь в реверансе).

Несмотря на мое несогласие с некоторыми пунктами:

>Наверно есть простой способ, типа HTTP_SESSION_VARS
-я выше обьянил, чем это не подгодит

>не нужно ничего регистрировать, а только сессии стартануть
-каждая проблема имеет простое, легкое в понимании, неправильное решение


Но предложенный вами путь - интересный. И должен помочь .

Еще раз прошу великодушно простить за проявленную в окопах тупость.


Ушел пить яд.
 

Green Lord

Читатель
Как оказалось, решение все-таки простое:

PHP:
<?
$VarSerList = split(";",session_encode());

for ($i=0;$i<count($VarSerList);$i++)
	{
	echo "
".substr($VarSerList[$i], 0, strpos($VarSerList[$i],"|"));
	echo " : ".unserialize(substr($VarSerList[$i], strpos($VarSerList[$i],"|")+1).";");
}
?>
 
Сверху