CodeIgniter的is_unique总是说值已经存在

时间:2015-03-06 05:50:09

标签: php mysql forms validation codeigniter

我正在使用CodeIgniter的表单验证,我花了很多时间试图解决这个问题,没有运气。 我有这个领域:

<input type="text" name="user" id="user" length="20" placeholder="Username">

我正在用它来验证:

$this->form_validation->set_rules('user', 'Username', 'trim|required|min_length[3]|max_length[20]|alpha_dash|is_unique[users.user]');

我的数据库有一个表usersuser是一个字段,所以我不知道我做错了什么,或者问题是什么。该表是空的(但我也试过它有记录),在phpmyadmin中选择了“unique”图标。 我知道数据库连接工作正常,因为如果我删除该规则并输入其他有效数据并提交表单,则会将用户添加到数据库中。

除非is_unique使用我尚未配置的另一个db配置文件?我真的不知道。这有点令人沮丧,我想我也可以放弃使用框架......

你的帮助会很棒!感谢。

6 个答案:

答案 0 :(得分:1)

这可能/可能没有帮助:您似乎在运行表单验证后加载数据库。还有一个错字uses.user

答案 1 :(得分:1)

在Transact-SQL中,单词&#34; USER&#34;是一个特殊的词。试试周围的uses.user,如下所示:

`users.user`
...看看是否有帮助。

答案 2 :(得分:1)

试试这个: -

$this->form_validation->set_rules('user', 'Username', 'trim|required|min_length[3]|max_length[20]|alpha_dash|unique[users.user]');

答案 3 :(得分:0)

需要加载数据库。

$this->load->database();

答案 4 :(得分:0)

我知道您的问题很老,但是最近我在自定义表单验证中遇到了类似的问题,经过认真的调试后,我找到了原因和解决方法。

显然,CI核心有一个小错误:调用is_unique表单验证方法时,数据库实例没有被实例化(至少在最新版本的CI中),从而阻止了检查的实际执行并始终返回false作为验证结果。

这是表单验证库(system/libraries/Form_validation.php)的解决方法

public function is_unique($str, $field)
{
    sscanf($field, '%[^.].%[^.]', $table, $field);

    // add the following line
    $this->CI->load->database();

    return isset($this->CI->db)
        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
        : FALSE;
}

通过在注释后添加行,您将确保数据库库已为is_unique方法正确地实例化,并且可以正常使用。如果没有这一行,isset($this->CI->db)检查将始终返回false

您也可以将该行放入库的构造函数中,但是然后您将使用所有不需要的表单验证规则来实例化数据库库(仅is_unique才需要)。

答案 5 :(得分:0)

以您的代码为例,is_unique验证规则通过在用户数据库表中查找名为user_name的字段来起作用。如果具有相同值的字段存在,则将其验证为false。

要确保它仅在用户提交新值时才运行,您可以对照从数据库中提取的值检查发布的值$this->input->post('user_name')来填充表单。如果它们相同,则不要验证is_unique

if($this->input->post('user_name') != $original_value) {
   $is_unique =  '|is_unique[users.user_name]'
} else {
   $is_unique =  ''
}

$this->form_validation->set_rules('user_name', 'User Name', 'required|trim|xss_clean'.$is_unique);