YII框架CGridView的使用问题和进行筛选分页时不安全的地方! [ 新手入门 ]
今天吧!发现一个YII框架小挂件CGridView的问题,如下使用的话一点都不安全! 还是先讲讲在发现问题之前使用CGridView出现的问题吧! 我手上有个项目,需要用到筛选机制。
[attach]615[/attach]
问题如下: 我也遇到了同样的问题,每次查询时用post提交查询条件,然后在动作中把值写入form,form验证后进行查询,创建page实例后显示。这样查询没有问题,当换页时参数得不到页面显示空白。我想有可能是get方式传入得不到,于是在动作中判断是否有查询条件语句改为empty($_REQUEST['form']),结果还是不可以,page生成的url不会把第一次post提交的查询条件写入。于是搜索源代码在CPageination.php文件中修改createPageUrl方法,由原来的$params=($this->route==='')?$_GET:array();改为$params=($this->route==='')?$_REQUEST:array();结果试验成功!整个原理就是第一次查询由用户点击页面查询按钮以post方式提交查询条件,再由page对象生成页码url(其中包括post提交来的查询条件,这就必须得改刚才我说的那段代码)。点击页码按钮就后就以get方式提交,由于action中是判断$_REQUEST所以没有问题可以接收到。不知道这样行不行,我测试用没有问题,只是url太长,有一些不必要的信息。
[attach]616[/attach][attach]616[/attach]引用地址:http://www.yiiframework.com/forum/index.php/topic/3214-yii查询条件分页的问题/
[attach]617[/attach]
[attach]618[/attach]
下一页的连接没有带上查询的参数,点击下页的时候出现了筛选之外的数据。
解决办法:
在构建筛选条件代码中如下写:
//构建查询条件
if (isset($_POST['Sms'])) {
if (empty($_POST['Sms']['period_start']) && empty($_POST['Sms']['period_end']) && empty($_POST['Sms']['keyword'])) {}
else {
$criteria = Sms::model()->getSmsAdmin();
$model->dbCriteria = $criteria;
$_GET['condition'] = $criteria->condition;
}
}
模型中:
public function search() {
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria = new CDbCriteria;
$criteria->compare('id', $this->id);
$criteria->compare('title', $this->title, true);
$criteria->compare('content', $this->content, true);
$criteria->compare('poster_id', $this->poster_id);
$criteria->compare('receiver_id', $this->receiver_id);
$criteria->compare('read_type', $this->read_type);
$criteria->compare('send_time', $this->send_time, true);
if (isset($_GET['condition']) && !empty($_GET['condition'])) {
$criteria->condition = $_GET['condition'];
}
return new CActiveDataProvider($this, array(
'criteria' => $criteria,
));
}
[attach]619[/attach] [attach]620[/attach]
问题解决,但随之而来的问题又来了!
如下:
[attach]621[/attach]
下一页的连接中出现了数据库字段。因为是GET传值,这样是非常不安全的! 试着用POST传值,但下一页的连接就不能附带传值了!
有人这么修改过, 不知道是否可以解决该问题!
[attach]622[/attach] [attach]623[/attach]
再说说为什么出现如上问题吧! CGridView中点击下一页时,会调用动作后,再执行模型里的search方法! 但是search方法是一个不带参数的CDbCriteria实例,所以点击下一页的时候会把筛选参数, 也就是$criteria->condition属性重新赋值为空, 所以进行筛选查找时,下一页的视图会显示筛选之外的数据! 解决办法可以把
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'sms-grid',
'dataProvider' => $model->search(),
中的 dataProvider 属性 使用其他的方法赋值, 就不会出现如上问题。 例子链接:http://blog.csdn.net/cypbkd/article/details/6527319 http://yiiframework.diandian.com/?tag=DAO方式查询分页代码
共 0 条回复
zhong21jia 江西新余
最后登录:1970-01-01
在线时长:0小时0分
- 粉丝0
- 金钱285
- 威望0
- 积分285