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

[讨论/交流] form_validation的唯一性验证

[复制链接]
发表于 2011-4-5 15:52:45 | 显示全部楼层 |阅读模式
本帖最后由 qi_ruo 于 2011-4-5 17:34 编辑

刚看了大师的6个codeigniter技巧
  http://codeigniter.org.cn/forums/thread-4443-1-1.html

里面的第三个是关于唯一性验证的技巧挺好用的 省得在控制器里写一些重复的验证函数了

不过这个验证函数只能用在类似添加用户的这种情况,在类似修改用户的表单里就无能为力了

不过我们经常是用 同一个 表单以及表单验证 来处理 添加和修改 的情况 所以我扩展了下
PHP复制代码
<?php
 
class MY_Form_validation extends CI_Form_validation
{
    function __construct($rules = array())
    {
        parent::__construct($rules);
    }
 
 
    function unique($value, $params)
    {
        $CI =& get_instance();
        $CI->load->database();
        $CI->form_validation->set_message('unique', '%s 已经存在.');
 
 
        $parts = explode('.', $params);
 
 
        $table = $parts[0];
        $column = $parts[1];
        $id_column = (isset($parts[2])) ? $parts[2] : '';
        $id = (isset($parts[3])) ? $parts[3] : (($id_column) ? $id_column : '');
 
 
        $CI->db->where($column, $value);
 
 
        if ($id_column && $id && isset($_POST[$id]) && $_POST[$id])
        {
            $CI->db->where("$id_column <>", $_POST[$id]);
        }
 
 
        return ($CI->db->count_all_results($table) > 0) ? FALSE : TRUE;
    }
}
?>
复制代码


使用方法:
只是用在添加的表单的验证,如:
$this->form_validation->set_rules('username', '用户名', 'required|max_length[16]|unique[users.username]');
这样将在users表的username字段检查是否已存在该用户名

用在添加或修改表单的验证,如:
$this->form_validation->set_rules('email', '电子邮件', 'required|max_length[255]|valid_email|unique[users.email.uid.id]');

其中users是表名 email是字段名 uid是主键字段名 id是表单中主键字段的name值;所以一定要在表单中包含一个类似
<input type="hidden" name="id" value="<?php echo (isset($user['uid'])?$user['uid']:'');?>" />这样类似的字段

如果表单中表示ID的字段的name和数据库中的ID字段名字相同可以只写一个,这样方便一点:
$this->form_validation->set_rules('email', '电子邮件', 'required|max_length[255]|valid_email|unique[users.username.uid]');

That's all.:)

评分

参与人数 2威望 +8 收起 理由
Hex + 5 我很赞同
jeongee + 3

查看全部评分

发表于 2011-4-5 17:28:24 | 显示全部楼层
感谢分享,加分鼓励~
发表于 2011-8-4 15:33:05 | 显示全部楼层
顶!
发表于 2013-1-22 17:34:41 | 显示全部楼层
如果表的主键不是 id 怎么办。
发表于 2013-1-22 19:37:38 | 显示全部楼层

感谢分享,加分鼓励~
发表于 2013-3-17 17:25:39 | 显示全部楼层
学习了

本版积分规则