Не Родные Сессии Против Родных

всем привет

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

это [color="#FF0000"]не работает[/color]


$session=new CHttpSession;

$session->open();

$session['test'] = array();

$session['test']['user']=Yii::app()->user->name;

это [color="#0000FF"]работает[/color]


$_SESSION['test'] = array();

$_SESSION['test']['user']=Yii::app()->user->name;

про использование Yii::app()->session->add() даже и говорить не приходится…

подскажите народ — может я чего не втыкаю? или не так делаю?

и как вы манипулируете данными в массивах находящихся в сессиях?

а так подойдёт?




Yii::app()->session['test'] = array();

Yii::app()->session['test']['user']=Yii::app()->user->name;

или




$session = Yii::app()->session;

$session['test'] = array();

$session['test']['user']=Yii::app()->user->name;

ну я вообше обычно всё привязываю к пользователю тоесть




Yii::app()->user->setState(string $key, mixed $value, mixed $defaultValue=NULL);

Yii::app()->user->getState(string $key, mixed $defaultValue=NULL);



но в принципе использование глобальной переменной $_SESSION вполне тоже возможно

Не знаю как у остальных, но у меня сессии в Yii тоже не работают, поэтому я пользуюсь обычным $_SESSION :)

to Mihail, почему-то ваши варианты не сработали


Yii::app()->session['test'] = array();

и

$session = Yii::app()->session;

буду юзать "обычные" сессии…

какие у тебя настройки сессии в конфиг фаиле?

вот они


'session' => array (

	'autoCreateSessionTable'=>false, # запрещаем автосоздание таблицы в базе

	'class'=>'system.web.CDbHttpSession', # подключаем класс

	'connectionID'=>'db',  # идентификатор соединения с базой

	'sessionTableName' => 'users_sess', # название таблицы

	'timeout'=>'3600', # время хранения данных в базе в секундах

),


Yii::app()->session['test'] = '..'

Очень хорошо работает. Тоже использую БД для хранения сессий.

Единственное добавлю были проблемы, с автогенеренной таблицей. Yii генерит таблицу с 32 знаками на идентификатор сессии если не путаю. Но размер ключа сессии генерился длиннее, из-за чего при каждом заходе нельзя было найти сессию и каждый раз создавалась новая сессия. Очень хорошо было заметно при логине, заходишь и тебя сразу выкидывает.

Это всё ещё так в свежих версиях?

не знаю…

у меня 1.1.12

p.s. она сильно отличается от Latest Release 1.1.14 (Aug 11, 2013) ?

Провёл пару тестов

настройки сессии


'session' => array (

			'autoCreateSessionTable'=>true, # запрещаем автосоздание таблицы в базе

			'class'=>'system.web.CDbHttpSession', # подключаем класс

			'connectionID'=>'db',  # идентификатор соединения с базой

			'sessionTableName' => 'users_sess', # название таблицы

			'timeout'=>'3600', # время хранения данных в базе в секундах

		),

у меня всё работает версия yii 1.1.13

сделал 2 экшина test и show

в экшине test запись данных


Yii::app()->session['test'] = '0';

в экшине show 1вариант


var_export($_SESSION); 

результат NULL

я подумал и понял что сессия автоматом не запускается дописал


Yii::app()->session;

var_export($_SESSION);

результат


array (

  'test' => '0',

)

тогда для того чтоб нигде вручную нигде не запускать сессию я дописал в конфиге


'preload'=>array('session'),

и экшине show 2вариант изменил на


var_export($_SESSION);

результат


array (

  'test' => '0',

)

ну и на всякий случай сделал ещё такой

экшине show 3вариант


var_export(Yii::app()->session['test']);

результат


'0'

всё отлично работает!!!

теперь я подумал как можно сделать так чтоб не работало!

ну и допустим если в index.php или перед тем как компонента запустить сессию вызвать session_start();

то действительно ничего не будет работать как и ошибок никаких выдавать тоже не будет!

погляди что где не так у тебя по идее всё должно работать!

хорошо! погляжу обязательно!

попробуй на своем тесте сделать еще такую последовательность шагов =


Yii::app()->session['test'] = array();

Yii::app()->session['test']['good'] = 'hello, world!';

Yii::app()->session['test']['myarr'] = array();

Yii::app()->session['test']['myarr']['bad'] = 'oops!';

а то ты манипулируешь с массивом в сессии только на уровне [color="#FF0000"]ключ-значение[/color], а надо на уровне [color="#0000FF"]многомерного массива[/color]

работает у тебя такая схема?

вот что должен представлять из себя массив test =


array(

    'good'=>'hello, world!',

    'myarr'=>array(

        'bad'=>'oops!',

    ),

);

p.s. когда я работал с данными в сессии как ты - и у меня проблем не было

Действительно не работает!

При Yii::app()->session[‘test’][‘good’] = ‘hello, world!’;

срабатывает функция


public function offsetGet($offset)

	{

	    return isset($_SESSION[$offset]) ? $_SESSION[$offset] : null;

	}

что возвращает само значение а не указатель

возможное решение 1 вариант




Yii::app()->session['test'] = new CMap;

Yii::app()->session['test']['good'] = 'hello, world!';

Yii::app()->session['test']['myarr'] = new CMap;

Yii::app()->session['test']['myarr']['bad'] = 'oops!';



или 2 вариант


Yii::app()->session; //запускаем компоненту

$_SESSION['test'] = array();

$_SESSION['test']['good'] = 'hello, world!';

$_SESSION['test']['myarr'] = array();

$_SESSION['test']['myarr']['bad'] = 'oops!';

данные будут хранится в бд в любом случае

единственный минус данного способа

изменение Yii::app()->session[‘test’][‘good’] = ‘hello, world!’; не сработает в 1 варианте сработает

или 3 вариант

в конфиге пишем ‘preload’=>array(‘session’),

и везде ползуемся только глобальной переменной $_SESSION

гут! надо будет попробовать на досуге!

p.s. спасибо, что не поленился потестить!

но я пока поиспользую так =


$_SESSION['test'] = array();

$_SESSION['test']['user'] = Yii::app()->user->name;

$_SESSION['test']['numb'] = $numb;

$_SESSION['test']['pages'] = array(1);

$_SESSION['test']['answers'] = array();

$_SESSION['test']['start'] = time();

$_SESSION['test']['final'] = false;