I have a controller that has a display data from a database depending on the ?id=
, it works correctly. However, if you do not give any value id gets error
error 400 Your request is invalid.
My code:
public function actionIndex($id)
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
$this->pageTitle = 'Page';
$criteria = new CDbCriteria(
array(
'condition' => 'name = :Name',
'params' => array(':Name' => $id),
//if $id is not defined then error
)
);
}
$ModelPages = Pages::model()->findAll($criteria);
$this->render('index',
array(
'Model' => $ModelPages,
)
);
}
I tried this out in such a way, but it did not help.
public function actionIndex($id)
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
$this->pageTitle = 'Page';
if(empty($id)){
$criteria = new CDbCriteria(
array(
'condition' => 'name = :Name',
'params' => array(':Name' => 'index'),
)
);
}
else {
$criteria = new CDbCriteria(
array(
'condition' => 'name = :Name',
'params' => array(':Name' => $id),
)
);
}
$ModelPages = Pages::model()->findAll($criteria);
$this->render('index',
array(
'Model' => $ModelPages,
)
);
}
Is my solution is correct (safe) when it comes to displaying the content according to the site?
You solution is correct but better use getQuery() method for fetching GET parameters and handle the error if no pages found:
public function actionIndex($id='index') //Notice the default parameter value
{
$id = Yii::app()->request->getQuery('id', 'index') //if id GET parameter does not exist $id will be 'index'
$criteria = new CDbCriteria(
array(
'condition' => 'name = :Name',
'params' => array(':Name' => $id),
)
);
$ModelPages = Pages::model()->findAll($criteria);
if (empty($ModelPages)) {
throw new CHttpExeption(404,'page not found');
}
$this->render('index',
array(
'Model' => $ModelPages,
)
);
}
Also if your action can not receive id
parameter you should set default value for it (actionIndex($id='index')
)
Try simply this way
public function actionIndex($id)
{
if(isset($id) && $id>0)
{
$this->pageTitle = 'Page';
$criteria = new CDbCriteria(
array(
'condition' => 'name = :Name',
'params' => array(':Name' => $id),
)
);
$ModelPages = Pages::model()->findAll($criteria);
$this->render('index',
array(
'Model' => $ModelPages,
)
);
}else
throw new CHttpException(404,'invalid request');
}