проблема сеанса codeigniter - некоторая информация сеанса не прилипает - PullRequest
1 голос
/ 25 января 2011

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

Я прикрепил ссылку, которая начинается на первой страницев серии, где можно перейти на следующую страницу.Я напечатал данные 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>

Ответы [ 2 ]

3 голосов
/ 25 января 2011

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

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

2 голосов
/ 25 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...