用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6116|回复: 13
收起左侧

验证表单输入时,能取某个输入是否验证完成吗?

[复制链接]
发表于 2008-6-20 13:00:43 | 显示全部楼层 |阅读模式
标题可能不好理解。

登录时,使用Email和Passwd来登录

$rules['Email'] = "trim|required|valid_email";
$rules['Passwd'] = "required|min_length[8]|md5|callback_login_check";

使用login_check来验证数据库中的信息和输入的是否匹配。

但是valid_email还没有执行的时候,就执行到login_check了。

我想等$rules['Email']验证完成后,才执行$rules['Passwd'] 有办法吗?

谢谢。
发表于 2008-6-20 13:35:21 | 显示全部楼层
那样你可能要自己派生一个验证类。
我没有太看懂你说的什么。
 楼主| 发表于 2008-6-20 14:14:21 | 显示全部楼层
我在做一个登录验证的东西。

代码如下:

在密码部分我派生了一个函数来验证是否正确。
遇到的问题:

PHP复制代码
$rules = array(
    'Email' => 'trim|required|valid_email',
    'Passwd' => 'required|md5|callback__login_check'
);
复制代码


这里设置的验证规则,$rules['Email']还没有验证的时候,$rules['Passwd']就开始验证了。也就是说是同时验证。

现在按下登录按钮后,效果是这样:

未命名-1.jpg

也就是说,还没有执行valid_email验证的时候,__login_check()就执行了。

我需要,等Email格式验证正确后才执行__login_check();

谢谢。

PHP复制代码
<?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 编辑 ]
发表于 2008-6-20 14:26:21 | 显示全部楼层
明白了,这就是同时验证的,因为是一个循环。
先后有什么区别吗?
 楼主| 发表于 2008-6-20 14:28:05 | 显示全部楼层
现在按下登录按钮后,效果是这样:

未命名-1.jpg


也就是说,还没有执行valid_email验证的时候,__login_check()就执行了。

我需要,等Email格式验证正确后才执行__login_check();

谢谢。
发表于 2008-6-20 14:40:35 | 显示全部楼层
验证类不能实现你说的功能,只能自己扩展了。
发表于 2008-6-20 14:42:43 | 显示全部楼层
原帖由 tangwenming 于 2008-6-20 14:28 发表
现在按下登录按钮后,效果是这样:

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.
发表于 2008-6-20 15:12:22 | 显示全部楼层
我分析了一下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的愿望就可以达成了。
 楼主| 发表于 2008-6-20 15:15:45 | 显示全部楼层
感谢itlong,非常感谢。
 楼主| 发表于 2008-6-20 15:18:03 | 显示全部楼层
不过不想修改这个类的内容,想扩展达到目的。

本版积分规则