2016-08-10 3 views
1

У меня есть большая строковая информация, передаваемая из представления в контроллер. Строка может превышать 65535 символов. Я попытался сохранить его в сессионных флэш-данных.Как хранить данные, отправленные из представления в контроллер в CI

Это мой метод в контроллере для хранения данных

public function get_dt_pemenuhan_d2(){ 
    $this->load->library('session'); 

    $list = $this->input->post('no_pnh'); //a huge list of item 

    $this->session->set_flashdata('sess_no_pnh',$list); 
} 

и это мой метод, чтобы извлечь данные из сеанса flashdata

public function pembebanan2(){ 
    $this->load->library('session'); 

    $get_no_pnh = $this->session->flashdata('sess_no_pnh'); 
    $data  = array('no_pnh' => $get_no_pnh); 

    $this->load->view('memo_pembebanan2',$data); //sending the data to a view 
} 

Все хорошо для небольших данных (менее чем 500 символов). Но если я храню огромные данные, на представление ничего не отправляется. Я использовал предупреждение, чтобы убедиться, что все данные полностью отправлены контроллеру, и все в порядке. Итак, что не так в коде?

Любая помощь и предложения приветствуются. Спасибо

Edit: это мнение, и как я отправляю данные в контроллер, а затем просмотреть его в виде всплывающего вида

$("#btn_memo").on('click',function(e){ 
    var arr_pnh = []; 
    $('#tbl_content tr td:nth-child(2)').each(function(){ 
     var x = $(this).text().split('||'); 
     arr_pnh.push(x[1]); 
    }); 

    var no_pnh = arr_pnh; 

    $.post('<?php echo site_url('con_atk/get_dt_pemenuhan_d2'); ?>',{no_pnh:no_pnh},function(){ 

     popUp = new Boxy("<iframe src='<?php echo site_url('con_atk/pembebanan2') ?>' width='640px' height='480px' frameborder='0'></iframe>" , {title: "<strong>Memo Pembebanan</strong>" , modal: true}); 
    }); 
}); 

И это мнение:

<div id="div_tbl_body"> 
      <table id="tbl_content" width="100%" class="table table-bordered" cellspacing="0" cellpadding="0"> 
      <thead> 
       <tr> 
        <th style="width:4%; text-align:right">No</th> 
        <th style="width:32%; text-align:center">Names</th> 
       </tr> 
      </thead> 
      <tbody> 
      //"<tr><td>"+ no++ +"</td>";<!-- This is generated by AJAX--> 
      // "<td align='center'>"+ id +"<font size='1px' color='#FFFFFF'>||"+no_pnh+"</font></td></tr>";<!-- This is generated by AJAX--> 
      </tbody> 
      </table> 
     </div> 

Мой вопрос: почему я не мог хранить огромные sata в сеансе? есть ли возможность хранить огромные данные в контроллере и к ним можно получить доступ, за исключением использования сеанса?

ответ

2

EDIT: После изучения, я нашел предложение и, скорее всего, сработает.

Я видел, что сеансы имеют ограниченный размер, а также даже печенье.

Лучший способ сделать это - получить данные, сохранить их в базе данных, перейти от вашей модели к контроллеру и передать ее во всплывающее окно.

Ваш следующий вариант будет хранить его в TXT-файле, а затем загружать его оттуда.

EDIT: Вот что вы можете сделать.

Публиковать данные делают контроллер, вместо того, чтобы делать это

public function get_dt_pemenuhan_d2(){ 
$this->load->library('session'); 

$list = $this->input->post('no_pnh'); //a huge list of item 

$this->session->set_flashdata('sess_no_pnh',$list); 
} 

ли это

public function get_dt_pemenuha_d2() 
{ 
    $this->load->model('your_model'); 
    $list = $this-input->post('no_pnh'); 
    $this->your_model->insert_into_table($list); 
} 

Это будет ваша модель функция

public function insert_into_table($list) 
{ 
    $this->db->insert('table_name',$list); 
} 

затем, если вы хотите получить доступ он просто делает это

public function pembebanan2() 
{ 
    $this->load->model('your_model'); 
    $data['list'] = $this->your_model->get_list(); 
    $this->load->view('memo_pembebanan2',$data); 
} 

это ваша функция get_list

public function get_list() 
{ 
    $this->db->get('yourtable'); 
} 

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

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

Теперь на ваш взгляд, нужно просто повторить, что список $

+0

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

+0

О, я сори. Вы пытаетесь отобразить символы в popup boxy, я прав? –

+0

да. на самом деле он работает нормально. но для примерно 500 символов или около 75 имен в списке. Мне может понадобиться больше, чем это. Может потребоваться более 1000 имен. – Vahn

1

Может просто попытаться сжать данные, используя gzencode

STH так:

$this->session->set_flashdata('sess_no_pnh', gzencode($list)); 

или просто хранить его в временный файл, и сохранить ссылку на сессии:

$tmpfname = tempnam("/tmp", "FOO"); 
$handle = fopen($tmpfname, "w"); 
fwrite($handle, $list); 
fclose($handle); 
$this->session->set_flashdata('sess_no_pnh', $tmpfname); 

, а затем просто прочитать его во всплывающем окне:

$get_no_pnh = $this->session->flashdata('sess_no_pnh'); 
$data  = array('no_pnh' => file_get_contents($get_no_pnh)); 
unlink($get_no_pnh);