Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массив в сессии?!
 
 автор: Anwor   (07.05.2006 в 11:58)   письмо автору
 
 

Люди, всем привет!

Интересует вопрос: неужели невозможно в сессионных переменных хранить массивы с даннвми? Ситуевина была такая: с одной страницы на другую сессионный массив сохранил мне эти данные, т.е. вывел в названии страницы статус пользователя:
Статус - менеджер
Страница состоит из фреймов, и когда я перехожу по ссылкам внутри фреймсета, не обновляя его, всё так и сохраняется. Но стоит мне нажать 'Refresh', т.е. обновить именно сам фреймсет, в названии страницы выводится лишь:
Статус -
- со всеми вытекающими, ибо по этому статусу должны права распределяться... в чем тут может быть лажа??

   
 
 автор: CrazyAngel   (07.05.2006 в 12:06)   письмо автору
 
   для: Anwor   (07.05.2006 в 11:58)
 

Можно хранить мохно но так

$_POSt['array'][] =

так вроде, тоесть мы делаем двухмерный массив

   
 
 автор: Anwor   (07.05.2006 в 12:24)   письмо автору
 
   для: CrazyAngel   (07.05.2006 в 12:06)
 

Дык ну нет, ну я так, получается, и делаю (только там $_SESSION, а не $_POST), но при обновлении страницы все индивидуальные переменные типа $_SESSION['user'], которая должна хранить имя пользователя, - сохраняются, а вот массивные вроде $_SESSION['status'] (по сути, она и есть массив) - пропадают безвести. Суть в том, что у 1 пользователя может быть несколько статусов, и поэтому тут без массива не обойтись.

   
 
 автор: cheops   (07.05.2006 в 12:45)   письмо автору
 
   для: Anwor   (07.05.2006 в 12:24)
 

А вы как присваиваете массив $_SESSION['user']? и что даёт распечатка дампа массива
<?php
  
echo "<pre>";
  
print_r($_SESSION);
  echo 
"</pre>";
?>

   
 
 автор: Boss   (07.05.2006 в 12:50)   письмо автору
 
   для: Anwor   (07.05.2006 в 11:58)
 

А в чем проблема?


for ($i=0; $i<10; $i++)
 { 
    $_SESSION['status'][$i] = $i; // заносим число в массив
}


хотя foreach было бы сдесь уместнее...

   
 
 автор: Саня   (07.05.2006 в 13:37)   письмо автору
 
   для: Anwor   (07.05.2006 в 11:58)
 

Проще запаковать массив:
<?php
$_SESSION
['status'] = serialize($status);
?>

Массив запакуется в строку. Чтобы распаковать эту строку обратно в массив:
<?php
$status 
unserialize($_SESSION['status']);
?>

   
 
 автор: Anwor   (07.05.2006 в 15:01)   письмо автору
 
   для: Саня   (07.05.2006 в 13:37)
 

Спасибо, но только я говорю: проблема не в том....
Заноситься - всё заносится, но вот в чем дело: он считывает данные из этих массивов ($_SESSION['status'] и $_SESSION['grants']) только лишь до первого рефреша! После нажатия "Обновить страницу" распечатка набора всех необходимых переменных дает следующие результаты:
немассивные переменные остаются в деле и распечатываются
$_SESSION['user']
$_SESSION['login']
а вот массивные теряют данные!
$_SESSION['status'][ ]
$_SESSION['grants'][ ]

Возможно, метод serialize поможет... я попробую.. т.е. в Вашем примере:
$status - массив
$_SESSION['status'] - строка?

хотя хотелось бы обойтись без serialize.. много лишних неудобств

   
 
 автор: Саня   (07.05.2006 в 15:11)   письмо автору
 
   для: Anwor   (07.05.2006 в 15:01)
 

Возможно, метод serialize поможет... я попробую.. т.е. в Вашем примере:
$status - массив
$_SESSION['status'] - строка?

Да.

много лишних неудобств
Нет. serialize() - самая удобная функция для работы с массивами.
Например, есть массив:
Array
(
    [1] => Some text
    [status] => 20
    [name] => admin
)

Запакую его в строку:
<?php
$a 
= array(=> "Some text""status" => 20"name" => "admin");
$str serialize($a);
print(
$str);
?>

На экран выведется строка:
a:3:{i:1;s:9:"Some text";s:6:"status";i:20;s:4:"name";s:5:"admin";}

С этой строкой моожно делать всё, что заблагорассудится! Пихать в массив, в файл, в БД без боязни, что нарушится структура запакованного массива.
Распаковать строку нужно так:
<?php
$str 
'a:3:{i:1;s:9:"Some text";s:6:"status";i:20;s:4:"name";s:5:"admin";}';
$a unserialize($str);
print_r($a);
?>

В результате выполнения этого скрипта выведется:
Array
(
    [1] => Some text
    [status] => 20
    [name] => admin
)

А это то же самое, что и в начале!

serialize()/unserialize() - это самое то, что вам нужно!

   
 
 автор: Anwor   (07.05.2006 в 23:34)   письмо автору
 
   для: Саня   (07.05.2006 в 15:11)
 

Я попробовал использовать этот метод, он действительно незаменим для отдельных случаев, однако в моей ситуации и он не помогает!

Зато я обнаружил еще более интересный финт!
Я уже говорил: страница, на которую мы переходим после внесения сессионных переменных, стоит на фрэймсете. Фрэймсет делит страницу на 2 области, верхняя из которых отображает все статусные данные (как раз из сессионных переменных) и служит менюшкой для нижнего фрейма.
Так вот.
Если мы возьмем свежезагруженную страницу с пустым низом, т.е. не нажимая на какие-л. ссылки, и нажмем по "Обновить", то всё остается на своих местах. Однако же стоит нам лишь раз щелкнуть по 1 из ссылок, а потом обновить страницу, - массивные переменные умирают!! Даже представленные в виде строки с помощью serialize! В чем же дело????!

   
 
 автор: Anwor   (07.05.2006 в 23:39)   письмо автору
 
   для: Anwor   (07.05.2006 в 23:34)
 

Оййй!! Извиняюсь, я понял.... там дело вообще не в этом. Дело совсем в другом модуле, где на каждую новую загрузку страницы прописан unset всех переменных кроме $_SESSION['user'] и $_SESSION['login']! Вот почему они оставались!
Всем спасибо за помощь!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования