0
为了验证多页面表单,我正在为(MVC)Controller的正确组织努力工作。问题是我不仅需要检查用户输入是否存在,而且我必须将其与不同的数据库(取决于字段)进行匹配。我还需要那些来自用户输入的不同视图选项的数据库数据。如何编写用于多页表单验证的控制器?
目前还不清楚我应该在哪里进行验证。我想把不太详细的东西放到控制器中,但同时我不喜欢使用彼此的模型(没有控制器)。
下面是来自控制器的基本的例子,这些步骤代表形式的不同阶段/页:
// GET VARIABLES FROM $_POST + $_GET
private function make_environment()
{
// PUT ALL VARIABLES INTO ARRAY
$vars = array();
if(!empty($_GET)) { $values = array_merge($vars,$_GET); }
if(!empty($_POST)) { $values = array_merge($vars,$_POST); }
// PUT ALLOWED VARIABLES INTO PROPERTY
foreach($this->properties as $property)
{
if(isset($values[$property]))
{
$this->properties[$property] = htmlspecialchars(trim($values[$property]));
}
}
}
// HANDLE DATA
// PRODUCES DATA FOR VIEW
private function set_data()
{
$data = '';
// CHOOSE DATA-OBJECT AND DATA-HANDLER
switch($this->properties['step'])
{
case 1:
// DATA HANDLER
$handler = new calendar($this->properties);
$data['calendar'] = $handler->return_data();
break;
case 2:
// DATA HANDLER
$handler = new form($this->properties);
$data['form'] = $handler->return_data();
break;
}
return $data;
}
// CREATE OR UPDATE VIEW
private function run_view($data)
{
new view('header','');
switch($this->properties['step'])
{
default:
new view('chooser','');
break;
case 1:
new view('calendar',$data['calendar'],$this->properties);
break;
case 2:
new view('form',$data['form'],$this->properties);
break;
}
new view('footer','');
}
在不同的“处理程序”(在set_data()
)正在查询的数据库的那一刻,但在此之前为此,我需要检查是否提交了必填字段以及这些字段是否有效(它们是否存在于数据库中)。我真的不知道该在哪里进行验证。希望在一个单独的模型,但我不得不查询数据库和在数据处理程序再次。也许你有一个想法?!
如果有些吝啬的人会尝试从已经处理的请求改变形式的数据?这将允许他通过错误的表单数据访问更高级别的表单。事情是我不能使用会话,所以我必须依靠帖子并获取,这很容易被操纵。 – Anonymous 2012-04-11 12:28:03
@DanSurfrider:不,表单的状态保存到会话中。这就是为什么有'importFromSession'和'exportToSession'。表单知道何时处理请求,该请求属于哪个页面/步骤。以前的数据不能改变客户端(仅在会话存储区内的服务器端)。 – hakre 2012-04-11 12:29:20
抱歉忘了提及我不想使用会话,所以我不得不依赖帖子,不幸的是。 – Anonymous 2012-04-11 12:35:03