关于自定义验证的求助
发布于:2022-01-17 09:50:54
#1 _admin
function name_exists($val, $right){
$conditions = array('displayname' => $val);
if ($this -> find($conditions)){
echo'1';
return TRUE;
}else{
echo'2';
return FALSE;
}
}
function mail_exists($val, $right){
$conditions = array('useremail' => $val);
if ($this -> find($conditions)){
echo'3';
return TRUE;
}else{
echo'4';
return FALSE;
}
以上是自定义的验证规则加几句输出语句用来检验代码之心情况
'reg_nick' => array(
'notnull' => TRUE,
'maxlength' =>10,
'name_exists' =>FALSE,
),
'reg_mail' => array( // 这里是对email的验证规则
'notnull' => TRUE, // email不能为空
'email' => TRUE, // 必须要是电子邮件格式
'mail_exists' =>true,
),
以上为检验内容;为了测验,设定'name_exists' 规则为true,设定'mail_exists' 规则false
在注册页面输入数据库中不存在的昵称及邮箱之后验证之后输出如下

很显然两个自定义验证函数返回值均为false,那么'mail_exists'这项验证应该通过;而'name_exists' 应该不能通过;
而验证的输出让我很困惑。。。。。。
请问各位大牛我的问题在哪里?
参考页面:
http://bbs.speedphp.com/thread-501-1-1.html?tid=501&page=1
该贴已经同步到 _admin的微博
2011-10-20 21:59:55
#2 _admin
var $addrules = array(
'verify_right' => array('user', 'check_verify'),
'name_exists' => array('user', 'name_exists'),
'mail_exists' => array('user', 'mail_exists'),
);
这是我的 addrules
2011-10-20 22:03:49
#3 jake
问题出在你对 $right 这个参数的理解有误。
$right 参数,正是你输入的验证结果值,比如说上面,
'reg_nick' => array(
'notnull' => TRUE,
'maxlength' =>10,
'name_exists' =>FALSE,
),
'reg_mail' => array( // 这里是对email的验证规则
'notnull' => TRUE, // email不能为空
'email' => TRUE, // 必须要是电子邮件格式
'mail_exists' =>true,
),
name_exists($val, $right)里面的 $right 应该是 FALSE 而 mail_exists($val, $right)的$right应该是true
那么在这两个函数里面,你应该做的,是把find的结果(true 或 false)和$right比对,然后返回比对结果——结果是true那么验证通过,结果是false那么验证不通过。
你的问题在于你没有使用$right值,只是直接返回(true或false)。
正确的写法应该是:
function mail_exists($val, $right){
$conditions = array('useremail' => $val);
if ($this -> find($conditions)){
// 电邮存在(true),但实际上赋值$right是不希望存在(false),所以结果与期望值应该不相等,所以返回结果是false。
return true == $right;
}else{
// 电邮不存在(false),赋值$right也是不希望存在(false),所以结果与期望值应该相等,所以返回结果是true。
return false == $right;
}
这样理解起来有些不自然,可以对比其他验证来看,
比如说maxlength验证规则,那么赋值$right是10,验证函数会验证输入值是否大于$right(10),如果大,那么就会返回false(验证不通过),如果不是大于$right,那么就会返回true。最终的true和false和$right值是直接相关的。上面的验证也是同理。
理解这个可以记住:负负得正,即可。
2011-10-20 22:24:34
#4 _admin
回复 3 jake 多谢管理员及时回复。我明白了,谢谢啦。。。
2011-10-20 22:36:30