验证表单输入时,能取某个输入是否验证完成吗?
标题可能不好理解。登录时,使用Email和Passwd来登录
$rules['Email'] = "trim|required|valid_email";
$rules['Passwd'] = "required|min_length|md5|callback_login_check";
使用login_check来验证数据库中的信息和输入的是否匹配。
但是valid_email还没有执行的时候,就执行到login_check了。
我想等$rules['Email']验证完成后,才执行$rules['Passwd'] 有办法吗?
谢谢。 那样你可能要自己派生一个验证类。
我没有太看懂你说的什么。 我在做一个登录验证的东西。
代码如下:
在密码部分我派生了一个函数来验证是否正确。
遇到的问题:
$rules = array(
'Email' => 'trim|required|valid_email',
'Passwd' => 'required|md5|callback__login_check'
);
这里设置的验证规则,$rules['Email']还没有验证的时候,$rules['Passwd']就开始验证了。也就是说是同时验证。
现在按下登录按钮后,效果是这样:
也就是说,还没有执行valid_email验证的时候,__login_check()就执行了。
我需要,等Email格式验证正确后才执行__login_check();
谢谢。
<?php
class Login extends Controller {
function Login()
{
parent::Controller();
$this->load->helper('form');
$this->load->library('validation');
}
function index()
{
// 设置验证规则
$rules = array(
'Email' => 'trim|required|valid_email',
'Passwd' => 'required|md5|callback__login_check'
);
$this->validation->set_rules($rules);
// 显示错误域
$this->validation->set_error_delimiters('<div class="errormsg">', '</div>');
// 填充表单
$fields = array(
'Email' => 'Email',
'Passwd' => 'Password'
);
$this->validation->set_fields($fields);
// 自定义错误信息
$this->validation->set_message('valid_email', '电邮地址不正确');
$this->validation->set_message('required', '必填字段不能为空');
if ($this->validation->run() === FALSE)
{
$data = array('title' => '登录', 'css' => 'legacy');
$this->load->view('page/head', $data);
$this->load->view('accounts/login');
$this->load->view('page/foot');
}
else
{
echo "<script>alert('登录完成');</script>";
//redirect ('accounts/login');
}
}
function _login_check($Passwd)
{
if($this->input->post('Email') == 'test@msn.cn' && $Passwd == md5('123'))
{
return TRUE;
}
else
{
$this->validation->set_message('_login_check', '密码不正确');
return FALSE;
}
}
}
?>
[ 本帖最后由 tangwenming 于 2008-6-20 14:26 编辑 ] 明白了,这就是同时验证的,因为是一个循环。
先后有什么区别吗? 现在按下登录按钮后,效果是这样:
也就是说,还没有执行valid_email验证的时候,__login_check()就执行了。
我需要,等Email格式验证正确后才执行__login_check();
谢谢。 验证类不能实现你说的功能,只能自己扩展了。 原帖由 tangwenming 于 2008-6-20 14:28 发表 http://codeigniter.org.cn/forums/images/common/back.gif
现在按下登录按钮后,效果是这样:
192
也就是说,还没有执行valid_email验证的时候,__login_check()就执行了。
我需要,等Email格式验证正确后才执行__login_check();
谢谢。 ...
胡搞:
一般是从rules的顺序验证,你这样设置当然是先valid_email, 再到_login_check,
你的意思是想只得到valid_email结果时,如果错,就停止,不再_login_check,
可是CI的validation是全盘全部给你验证,你得到的是最后全部的结果,
LZ上的结果,就是全部验证的结果,不能说明是;先_login_check,再到valid_email..
UNDERSTAND. 我分析了一下Validation 类,如果LZ想得到你想的效果,你可以改写validation ->run()这个函数,或扩展一个validation类,改下run()这个函数。
我看了run()这个函数最后几行是这样写的(338-340行):
338行://Add the error to the error array
339行:$this->_error_array[] = $message;
340行:continue 2;
这里340行continue 2是如果检查一个rules[‘field’]里一个规则出错,就跳回2个foreach去验证下一个rules['field'].意思是:
rules['field1'] = 'trim|required|valid_email',只要检测到required,如果出错,就不检测valid_email,
而跳到一下rules['field2'];
如果,想检测rules['field1']中required,出错就跳出不再检查 rules['field2'],
可以把run()的第340行改成break 2;
LZ的愿望就可以达成了。 感谢itlong,非常感谢。 不过不想修改这个类的内容,想扩展达到目的。
页:
[1]
2