2

私はコントローラーのインデックスアクションでこれらのコードを持っています:

public function actionIndex()
{ 
  $cid = @$_GET['cid'];
  $country = Country::model()->findByPk($cid);

  if($cid)
    $dataProvider=new CActiveDataProvider('City', array(
      'criteria'=>array(
        'condition'=>'ci_co_id ='.$cid,
      ),
    ));
  else
     $dataProvider=new CActiveDataProvider('City'); 
  $this->render('index',array(
 'dataProvider'=>$dataProvider,
     'country' => $country
    ));
  }

そしてこれらはview/index.phpファイルにあります:

<?php 
$this->widget('zii.widgets.grid.CGridView', array(
  'id'=>'city-grid',
  'dataProvider'=>$dataProvider,
  'filter' => $dataProvider,
  'columns'=>array(
    array(
        'name' => ' ',
        'value' => '$row + 1',
    ),  
    'ci_name',
    'ci_pcode',
    array(
        'class'=>'CButtonColumn',
    ),
   )
));

?>

しかし、Yiiは私にこのエラーを与えます:

CActiveDataProvider and its behaviors do not have a method or closure named "getValidators". 

何が問題ですか?

4

1 に答える 1

3

フィルターは、CModel を拡張するクラスである必要があります。ただし、実際のフィルタリングを行っているようには見えないためfilter、CGridView の行をコメントアウトするだけです。

補足として、基準に大きなセキュリティホールがあります。SQL インジェクション攻撃に対して無防備なままになっています。

データベース ハンドラが入力を適切にエスケープできるようにするには、次のように基準を指定します。

'criteria'=>array(
  'condition'=>'ci_co_id =:cid',
  'params'=>array(':cid'=>$cid),
),
于 2012-12-30T22:09:38.010 に答える