如何将视图中发送的数据存储到CI

时间:2016-08-10 02:46:04

标签: php codeigniter session controller

我有一个从视图发送到控制器的大字符串数据。该字符串可能超过65535个字符。我试图将它存储在会话闪存数据中。

这是我在控制器中存储数据的方法

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个字符),一切都很好。但是,如果我存储了大量数据,则不会向视图发送任何内容。我已经使用警报来确保所有数据完全发送到控制器,这一切都很好。那么,代码中有什么问题?

非常感谢任何帮助和建议。谢谢

修改: 这是视图以及我如何将数据发布到控制器,然后在弹出视图中查看它

$("#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 个答案:

答案 0 :(得分:2)

编辑:经过研究,我找到了一个建议,很可能会有效。

我看到会话的大小有限,甚至还有cookie。

最好的方法是获取数据,将其存储在数据库中,从模型进入控制器,然后将其传递给弹出窗口。

您的下一个选项是将其存储到.txt文件中,然后从那里加载。

编辑:您可以做以下事情。

发布数据做一个控制器,而不是这样做

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');
}

如果你想要完成,你可以删除表格的内部,或者如果你想保留其他人的名单,可以使用一个ID来使用where子句。

无需将其变为全局变量,只需加载模型并获取列表

现在在您的视图中,您只需回显$ list

答案 1 :(得分:1)

也许只是尝试使用gzencode

压缩数据 是这样的:

$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);