codeigniter分页与选定的记录

时间:2011-11-22 07:25:12

标签: php mysql codeigniter

我是codeigniter的新手。希望可以帮助解决codeigniter分页问题。

  1. 我从我的视图中选择了一些记录并使用$ _POST传递给我的控制器。
  2. 控制器将使用$ _POST变量从模型中选择记录。
  3. 然后记录将以分页显示在同一视图中。
  4. 步骤1-3是okey,视图显示正确的信息。

    1. 从我的视图中按下分页按钮。这将调用相同的控制器,但$ _POST信息将变为空白。因此,我的视图不会根据需要显示所选记录。
    2. 希望能有所帮助。

      我简化了以下代码: -

      控制器:

          $config['total_rows']=$this->invdata_model->getFilterData_numRows();
      
          $config['base_url']=site_url('site/users_area') ;
          $config['uri_segment'] = '3'; 
          $config['per_page']=18;
          $config['num_links']=4;
      
          $this->pagination->initialize($config);
      
          $data['records']=$this->invdata_model->getFilterData_Rows($config['per_page'],$this->uri->segment(3));
          $data['rec_country']=$this->invdata_model->country();
      
          $this->load->view('includes/header');
          $this->load->view('users_area_view',$data);
          $this->load->view('includes/footer');
      

      模型:

          $country = $this->input->post('country') ;
      
      
          $this->db->select('stockno, bdlno, country,volton');
          if (isset($country)) { $this->db->where_in('country',$country); }
          $q=$this->db->get('inventory')->num_rows();
      
          return $q ; 
      

      查看

        <?php echo form_open('site/users_area');   
              echo $this->table->generate($records);   
              echo $this->pagination->create_links() ;    ?>
      
        <div class="gadget">
      <?php echo form_submit('submit','Apply','class="button_form"'); ?>      
        </div>
      
        $gadget['gadget_name']='country'; 
        $gadget['gadget_rec']=$rec_country; 
        $this->load->view('gadget',$gadget);
        </form>
      

      查看小工具

        <div class="gadget">
        <?php
      
        $gadget_name2=$gadget_name.'[]';
      
        echo "<ul>";
        foreach ($gadget_rec as $item) {
          echo '<li >';  
          echo '<div id="sectionname">'.$item.'</div>';
          echo '<div id="sectioninput"><input type="checkbox" name="'.$gadget_name2.'" value="'.$item.'"></div>' ;
          echo '-';
          echo "</li>";  
        }
      
        echo "<ul>";
         ?>
        </div>
      

      谢谢。

3 个答案:

答案 0 :(得分:1)

这听起来像是一个方法问题。为什么使用POST数据来过滤数据?分页库构建查询字符串以确定数据库查询结果的偏移量。为什么不能使用$ _GET而不是$ _POST?

我想可以将您的分页配置'base_url'设置为:

$this->load->helper('url');
$this->load->library('pagination');

$config['base_url'] = current_url().'?'.http_build_query($_POST);
$config['total_rows'] = 200;
$config['per_page'] = 20;

$this->pagination->initialize($config);

echo $this->pagination->create_links();

然后在你的控制器中,使用$ this-&gt; input-&gt; get_post(),而不是$ this-&gt; input-&gt; post()。这里要小心 - 将完整的后期数据直接传递到模型中进行处理是很安全的。最好使用CI的输入类来防止XSS攻击...

<强>更新

要使用CI的输入类,而不是直接使用$ _POST或$ _GET,我通常会将表单数据保存在各种类型的“命名空间”中,即:

<input type="text" name="search[criteria1]" />
<input type="text" name="search[criteria2]" />
<input type="text" name="search[criteria3]" />

然后,在你的控制器中:

...
public function some_resource()
{
    $this->load->model('Some_model');
    $search_criteria = $this->input->get_post('search');
    if ($search_criteria)
    {
        // make sure here to remove any unsupported criteria
        // (or in the model is usually a bit more modular, but
        // it depends on how strictly you follow MVC)
        $results = $this->Some_model->search($search_criteria);
    }
    else
    {
        // If no search criteria were given, return unfiltered results
        $results = $this->Some_model->get_all();
    }

    $this->load->view('some_view', array(
        'results'         => $results,
        'pagination_base' => current_url().'?'.http_build_query($search_criteria)
    ));
}
...

因为我指定了$ this-&gt; input-&gt; get_post (),所以它会首先检查查询字符串参数;如果它不存在,它将回退到发布数据。这将允许您在表单中使用POST,但仍然通过带有分页类的查询字符串传递相同的数据。但是,实际上表单应该使用GET方法,因为您将这些参数作为查询发送,而不是向服务器发送内容。只是我在这个细节上的$ .02。

答案 1 :(得分:0)

分页类使用GET请求,只需使用页面的记录偏移量修改URL。例如,第2页显示每页显示50条记录的列表为/ some / url / 50,第3页为/ some / url / 100。

你可以:

  1. 更改#3以使用POST或GET并调用可识别要选择的记录的URL,或
  2. 扩展分页类,以输出每次更改页面时从#2重新发送相同POST数据的表单(并使每个页面链接POST一个而不仅仅是一个链接)。
  3. 我认为#1可能是最好的选择。这是SEF,可以加入书签,并且整体上更清晰。

    例如,您可以像平常一样使用表单,但也可以使用/ some / unique / url直接转到结果

    然后每个分页链接将调用/ some / unique / url / 50,其中50是记录偏移量(分页类使用偏移而不是页码)。

答案 2 :(得分:0)

我建议您编辑:

$config['base_url']=site_url('site/users_area/arg1/arg2') ;

然后“$ _GET”它形成url或jst使用

$val1 = $this->uri->segment(3);
$val1 = $this->uri->segment(4);

并且还会更改您的uri_segment

$config['uri_segment'] = '3';to
$config['uri_segment'] = '5'.

取决于通过网址的argumnts数量