2011-01-25 2 views
1

Я использую библиотеку сеансов codeigniter для хранения данных, которые используются в серии из 3 страниц, и я испытываю странное поведение. Мои переменные сеанса остаются в такте, но значения исчезают. Даже незнакомец: я пытаюсь сохранить сериализованный массив в моих данных сеанса, и первый элемент массива заканчивается тем, что он хранится в другой переменной?проблема с кодомignign session - некоторая информация о сеансе, не вставляющая

Я прикрепил ссылку, которая начинается с первой страницы в серии, где можно перейти на следующую страницу. Я напечатал данные user_session в верхней части обеих страниц (третья страница еще не настроена).

http://playmatics.com/nypl/site/index.php/member_area/quest/accept_quest/12

Сессии работать везде, к примеру, я использую сеанс для хранения регистрационных данных, и работает отлично.

Я приложил мой контроллер и вид ниже

//CONTROLLER: 
    function accept_quest() { 
     $assoc_quest_id = end($this->uri->segments); 

     if(!isset($quest_id)) { 
      redirect('member_area/quest'); 
      //SEND A MESSAGE: NO QUEST STARTED 
     } 

     $quest_rows = $this->quest_model->get_quest_with_images($assoc_quest_id); 
     $quest = current($quest_rows); 
     $images = $this->pull_out_images($quest_rows); 

     //the data array is used both in the session, 
     //to pass values over to the next function in the quest chain 
     //and in the template 
     $data = array(); 
     $data['quest_id'] = $assoc_quest_id; 
     $data['instruction_text'] = $quest->instructions; 
     $data['quest_title'] = $quest->name; 
     $data['quest_time_limit'] = $quest->time_limit; 
     $data['points_awarded'] = $quest->points_availible; 
     $data['quest_images'] = serialize($images); 

     //save data in a flash session to be used in the next function call in the quest chain: quest_action 
     $this->session->set_userdata($data); 
     print_r($this->session->all_userdata()); 


     //the following data aren't needed in the session so they are added to the data array after the session has been set 
     $data['annotation_text'] = $quest->note;   
     $data['main_content'] = 'quests/quest_desc'; 
     $this->load->view('includes/template', $data); 
} 


function quest_action() { 
    print_r($this->session->all_userdata()); 

    $quest_id = $this->session->userdata('quest_id'); 
    echo "the quest id is: $quest_id"; 
    if(!isset($quest_id)) { 
     redirect('member_area/quest'); 
     //SEND A MESSAGE: NO QUEST STARTED 
    } 

    $data['quest_id'] = $quest_id; 
    $data['quest_title'] = $this->session->userdata('quest_title'); 
    $data['quest_images'] = $this->session->userdata('images'); 
    $data['instruction_text'] = $this->session->userdata('instructions'); 
    $data['quest_time_limit'] = $this->session->userdata('quest_time_limit'); 

    $data['main_content'] = 'quests/quest_action'; 
    $this->load->view('includes/template', $data);     
} 

//VIEW 
    //quest_desc: 
<h1><?= $quest_title ?></h1> 
    <div id="quest_elements"> 
     <figure> 
     <? foreach(unserialize($quest_images) as $image): ?> 
      <img class="media" src="<?= $image ?>" alt="<?= $quest_title ?> image"/> 
     <? endforeach; ?> 
      <figcaption>annotation: <?= $annotation_text ?></figcaption> 
     </figure> 
     <?= anchor("member_area/quest/quest_action", "Start Quest", array('title' => 'start quest')); ?> 
    </div><!-- end quest_elements --> 


    //quest_action: 
<h1><?= $quest_title ?></h1> 
    <div id="quest_elements"> 
     <figure> 
     <? foreach(unserialize($quest_images) as $image): ?> 
      <img class="media" src="<?= $image ?>" alt="<?= $quest_title ?> image"/> 
     <? endforeach; ?> 
      <figcaption>instructions: <?= $instruction_text ?></figcaption> 
     </figure> 
    <div id="timer"> 
     <?= $quest_time_limit; ?> 
    </div> 
    <?= anchor("#start_timer", "Start Timer", array('title' => 'start quest timer')); ?> 
</div> 
+0

CI использует файлы cookie по умолчанию для хранения сеансов. Вы уверены, что не используете ограничение размера файла cookie? –

+0

Кроме того, если вы шифруете данные сеанса, вы увеличиваете размер своих данных и, возможно, быстрее достигаете предела. – k00k

+0

ах, это, вероятно, проблема. Благодаря! – JoeM05

ответ

2

Как уже говорили другие, вполне вероятно, что вы ударять 4k предел печенья библиотеки сессии КИ. Существуют и другие доступные альтернативные библиотеки, которые используют стандартные сеансы PHP - например, http://codeigniter.com/wiki/PHPSession/ и http://codeigniter.com/wiki/Native_session/.

3

Если вы нажимаете ограничение на размер файла cookie, я бы предложил перейти на родной код CodeIgniter Database Sessions class. Это позволяет хранить информацию о сеансе в базе данных, эффективно удаляя ограничение размера файла cookie, вы просто ограничены размером поля user_data в базе данных ci_sessions.

Следуя приведенной выше ссылке, раздел об использовании сеансов базы данных находится в нижней части, предоставляя вам правильную схему БД и конфигурационный переключатель для сеансов базы данных.

Смежные вопросы