CActiveDataProvider分页异常:点击分页后无数据显示问题问询
分页点击第二页无数据的问题分析与修复
我来帮你拆解这个问题的核心原因,以及对应的修复方案:
问题根源
你的代码逻辑存在两个关键问题,直接导致了分页第二页无数据的现象:
- 分页请求是GET,但搜索逻辑仅绑定POST:当点击分页链接时,浏览器发送的是GET请求,而你的代码只有在
$_POST['CompanyProfile']存在时才会构建正确的查询条件。此时没有POST数据,代码会走初始的$criteria1逻辑——也就是cmpny_profile_id=-1的条件,自然查不到任何记录。 - 搜索条件未在分页请求中保留:即使提交了表单,分页链接里也没有携带搜索关键词的参数,导致翻页时直接丢失了之前的搜索条件,回到了错误的默认查询。
另外,初始加载时的cmpny_profile_id=-1条件应该是测试用的吧?正常场景下初始加载应该展示所有公司记录,这个条件本身就会导致页面加载时无数据,和你描述的现象完全一致。
修复方案
我们可以通过以下几步来彻底解决这个问题:
同时支持GET和POST请求处理搜索条件
把判断条件从$_POST改成$_REQUEST,这样不管是表单提交(POST)还是分页请求(GET),都能正确获取搜索参数:public function actionCompany() { $model = new CompanyProfile(); // 用$_REQUEST同时处理POST提交和GET分页请求 if(isset($_REQUEST['CompanyProfile'])){ // 用attributes批量赋值更规范,也能利用模型的验证规则 $model->attributes = $_REQUEST['CompanyProfile']; $criteria = new CDbCriteria(); if(!empty($model->cmpny_profile_name)) { $criteria->addSearchCondition('cmpny_profile_name', $model->cmpny_profile_name); } $dataProvidernew= new CActiveDataProvider('CompanyProfile',array( 'criteria'=>$criteria,'pagination'=>array('pageSize'=>10), )); } else { // 初始加载时,直接展示所有记录,去掉错误的cmpny_profile_id=-1条件 $dataProvidernew= new CActiveDataProvider('CompanyProfile',array( 'pagination'=>array('pageSize'=>10), )); } $this->render('company',array('model'=>$model,'dataProvider'=>$dataProvidernew)); }修改表单提交方式为GET(可选但推荐)
在视图的表单代码里,把提交方式改成GET,这样搜索参数会显示在URL中,分页链接会自动带上这些参数,确保翻页时条件不丢失:<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'company-profile-form', 'method'=>'get', // 改为GET提交 // 其他表单属性... )); ?>
为什么这样有效?
$_REQUEST会同时读取POST和GET参数,所以分页的GET请求也能拿到之前的搜索关键词,构建正确的查询条件。- 去掉初始的
cmpny_profile_id=-1条件,确保页面首次加载时能展示正常的公司列表。 - GET提交的表单参数会被CActiveDataProvider的分页组件自动包含在分页链接中,翻页时搜索条件不会丢失。
内容的提问来源于stack exchange,提问作者Nagaraju Chimmani
相关产品推荐
相关产品推荐

