YII通过get参数清理输入

时间:2016-07-20 12:53:49

标签: php validation yii



我在yii1工作。我想编辑基于id(主键)的记录,并将id inf从查询字符串的形式从一个页面传递到另一个页面。现在我想在我收到id的控制器上清理那个id 我使用filter_input()但它无法工作。

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永远是一个数字而不是url中的任何符号

2 个答案:

答案 0 :(得分:0)

嗨,为什么不在你的身份之前使用int

将您的字符串明确地投射到integer

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

答案 1 :(得分:0)

我今天在工作中一直在努力解决类似的问题,并认为我会添加我的发现。我正在更新使用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中过滤器函数使用的内部指针。您可以通过执行以下操作在没有Yii的情况下复制问题:

$_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,这样您就可以访问与filter_input相同的功能,并且不会遇到与{{filter_input相同的问题1}}。有关详细信息,请参阅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;
}