qi_ruo 发表于 2011-4-5 15:52:45

form_validation的唯一性验证

本帖最后由 qi_ruo 于 2011-4-5 17:34 编辑

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

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

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

不过我们经常是用 同一个 表单以及表单验证 来处理 添加和修改 的情况 所以我扩展了下<?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;
      $column = $parts;
      $id_column = (isset($parts)) ? $parts : '';
      $id = (isset($parts)) ? $parts : (($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|unique');
这样将在users表的username字段检查是否已存在该用户名

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

其中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|valid_email|unique');

That's all.:)

jeongee 发表于 2011-4-5 17:28:24

感谢分享,加分鼓励~

cstkwjk 发表于 2011-8-4 15:33:05

顶!

hamoon 发表于 2013-1-22 17:34:41

如果表的主键不是 id 怎么办。

smallhe 发表于 2013-1-22 19:37:38


感谢分享,加分鼓励~

bob 发表于 2013-3-17 17:25:39

学习了
页: [1]
查看完整版本: form_validation的唯一性验证