如何在CI中存储从视图发送到控制器的数据


How to store data sent from view to controller in CI

我有一个大字符串数据从视图发送到控制器。字符串长度不能超过65535个字符。我已经尝试将其存储在会话flash数据中。

这是我在控制器中存储数据的方法
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个字符),一切都很好。但如果我存储一个大数据,什么都不会发送给视图。我使用alert来确保所有数据完全发送到控制器,一切正常。那么,代码中有什么问题呢?

任何帮助和建议都是非常感谢的。谢谢你编辑:

这是视图以及我如何将数据发送到控制器然后在弹出视图

中查看它
$("#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 ?是否有任何选项来存储巨大的数据在控制器,可以通过方法访问除了使用会话?

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

我看到会话的大小是有限的,甚至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

也许只是尝试使用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);