最近在写注册系统,涉及到注册、找回用户名以及找回密码,这其中肯定涉及到大量的表单,仅仅依靠前端js验证数据是不行的,我用的ThinkPHP框架,ThinkPHP自带表单验证功能,使用起来还是相当方便的。我简单说下使用方法
将需要验证的表单数据写在模型里,格式是这样的:
//自动验证
protected $_validate = array(
array('llid','require','必须填写流量账号',1),
array('llpwd','require','必须填写流量账号密码',1),
array('code','require','必须填写验证码',1),
array('uupwd','require','MV必须填写呦呦账号密码',1),
array('uupwd','uupwd_insure','两次密码不一致',0,'confirm'),
);
具体参数的意思自己去参考开发手册,然后还需要在相应的控制器中这么写:
$mod = D('Index/Getpwd');
if(!$mod->create(I(),1)){
exit($mod->getError());
}else{
$up_status = $mod->update_pwd($stuid,$pwd);
return $up_status;
}
如果验证通过,则create方法会成功创建数据对象,否则会失败,$mod->getError()返回错误信息。
ThinkPHP提供的还有个表单令牌,开启方法:模块的配置目录下面的行为定义文件tags.php中添加下面的代码:
return array(
// 添加下面一行定义即可
'view_filter' => array('Behavior\TokenBuild'),
// 如果是3.2.1版本 需要改成
// 'view_filter' => array('Behavior\TokenBuildBehavior'),
);
然后在配置文件中添加如下配置:
'TOKEN_ON' => true, // 是否开启令牌验证 默认关闭
'TOKEN_NAME' => '__hash__', // 令牌验证的表单隐藏字段名称,默认为__hash__
'TOKEN_TYPE' => 'md5', //令牌哈希验证规则 默认为MD5
'TOKEN_RESET' => true, //令牌验证出错后是否重置令牌 默认为true
这样就可以打开表单令牌,表单令牌的主要作用是防止重复提交,在渲染模板的时候会自动生成以TOKEN_NAME为名称的隐藏域,其值则是TOKEN_TYPE方式生成的哈希字符串,每次刷新页面的时候会重新生成,每次POST数据的时候将这个隐藏域一并POST过去,后端接收到之后验证合法性,然后销毁对应SESSION,此时如果不刷新页面而重复提交则会提示表单令牌错误。
由于博主写的注册系统需要使用Curl模拟登陆抓取信息认证,模拟登陆有个验证码,所以重复提交是不会通过验证的,而且表单提交使用的是angularjs的异步提交,再次刷新页面则毫无意义。所以关闭了表单令牌功能。使用angularjs异步提交数据的时候是不包含生成的hash值的,需要使用js获取,简单说下,
$scope.formData['__hash__'] = document.getElementsByName('__hash__')[1].value;