我认为仅仅考虑 sql 注入是不够的。您必须检查 json 数组中的数据,因为可能会发送错误的字段名称或错误的方向。
所以
$criteria = new CDbCriteria();
$arySort= json_decode($_GET['sort']);
$criteria->order=$this->prepareSort($_GET['sort']);
Person::model()->findAll($criteria);
public function prepareSort($arySort)
{
$property='t.id';
$direction='ASC'
if(is_seet($arySort[0])
{
if(in_array($arySort[0]->property, array_keys($this->attributes))
$property=$arySort[0]->property;
if(in_array($arySort[0]->direction, array('ASC', 'DESC')))
$direction=$arySort[0]->direction;
}
return $property.' '.$direction;
}
附言
在使用这样的 CGridView 的情况下
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('t.id',$this->id);
$criteria->compare('t.title',$this->title,true);
$criteria->compare('content',$this->content,true);
$criteria->compare('url',$this->url,true);
return new CActiveDataProvider(
$this,
array(
'criteria'=>$criteria,
'sort'=>array(
'defaultOrder'=>'title ASC',
'attributes'=>array(
'*'
)
),
'pagination'=>array(
'pageSize'=>20,
),
)
);
}