我在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中的任何符号
答案 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;
}