2016-07-20 9 views
1



私はyii1で働いています。 id(プライマリキー)に基づいてレコードを編集し、ID infをあるページから別のページへのクエリ文字列の形式で渡します。今私はIDを受け取ったコントローラーでそのIDを消毒したい。
私はfilter_input()を使用しますが、仕事はできません。

YIIはgetパラメータで入力をサニタイズします

public function actionEditStudentById() 
{ 
    try 
    { 
     $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); 
     echo $id; 
     die(); 

     $id = $_GET['id']; 
     $model = StudentDetail::getStudentById($id); 

     if (!$model) throw new Exception; 

     if(isset($_POST['StudentDetail'])) 
     { 
      $model->attributes = $_POST['StudentDetail']; 
      if($model->validate()) 
      { 
       $model->save(FALSE); 
       Yii::app()->user->setFlash('update', "Record updated successfully!"); 
       $this->redirect(['student/list']); 
      } 
     } 
     $this->render('_form',array('model'=>$model)); 
    } 
    catch(Exception $e) 
    { 
     echo 'Invalid user id: user not available'; 
    } 
} 

ここdie()は、単にコードを停止するために使用されます。 die()の直前のIDは常にnullです。私は、idは常に、あなたのIDの前にint型を使用していないのはなぜ数ではなく任意のシンボルがURLにできます

+0

何あなた 'getStudentById()'メソッドは次のように見えますか? –

答えて

0

こんにちは

が明示的に

$id = (int)$_GET['id']; 
+0

Ya!それも働いている、ありがとう!これに関連する別の問題がある場合は、 –

+0

@PalashGuptaそれがあなたの答えになります:) – user1234

0

I integerにあなたの文字列をキャストすることであることを望みます今日の仕事で同様の問題に苦しんでいて、自分の発見を追加すると思っていました。私はYii 1.1を使用するアプリケーションをアップデートしていますが、フラグをチェックしようとしていましたが、filter_inputは常に失敗していました。私は、何が起こっているのかを試してみるために、次のプログラムをプログラムに追加しました。

次のようにエラーログに出力された
if(isset($_GET['m'])) 
{ 
    error_log("GET['m'] = " . var_export($_GET['m'], true)); 
} 

$bFiltered = filter_input(INPUT_GET, 'm', FILTER_VALIDATE_BOOLEAN); 
error_log('Filtered = ' . var_export($filtered, true)); 

GET['m'] = 'true' 
Filtered = NULL 

filter_inputのためのPHPマニュアルのエントリによると、名前の値が存在しない場合は、nullが返されます。

私はこれを確認できませんが、Yiiは$_GET$_POSTのグローバルを操作しており、PHP内のフィルタ関数で使用される内部ポインタを破っていると思います。

$_GET['test'] = "true"; 
echo 'Raw value = ' . var_export($_GET['test'], true) . '<br>'; 

$bFiltered = filter_input(INPUT_GET, 'test', FILTER_VALIDATE_BOOLEAN); 
echo 'Filtered value = ' . var_export($bFiltered, true) . '<br>'; 

これは、次のような出力生成:

Raw value = 'true' 
Filtered value = NULL 

潜在的な解決策ではなく、$ _GET変数に直接filter_varを使用することですが、これはあなたを与えるあなたは以下のようにして、Yiiのせずに問題を複製することができますfilter_inputと同じ機能にアクセスでき、filter_inputと同じ問題が発生しません。詳細については、filter_varのPHPマニュアルエントリを参照してください。

$_GET['test'] = "true"; 
echo 'Raw value = ' . var_export($_GET['test'], true) . '<br>'; 

$bFiltered = filter_var($_GET['test'], FILTER_VALIDATE_BOOLEAN); 
echo 'Filtered value = ' . var_export($bFiltered, true) . '<br>'; 

は、次の出力を生成します:上から簡単な例を使用して

Raw value = 'true' 
Filtered value = true 

この方法の欠点は、あなただけの場合にはisset()テストでそれをラップすることを忘れないように持っていることです値は使用できません。例えば

if (isset($_GET['test'])) 
{ 
    $bFiltered = filter_var($_GET['test'], 
          FILTER_VALIDATE_BOOLEAN, 
          array('options' => array('default' => false))); 
} 
else 
{ 
    $bFiltered = false; 
} 
関連する問題