CodeIgniter 的 is_unique 总是说值已经存在

Posted

技术标签:

【中文标题】CodeIgniter 的 is_unique 总是说值已经存在【英文标题】:CodeIgniter's is_unique always saying value already exists 【发布时间】:2015-05-07 17:17:19 【问题描述】:

我正在使用 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 使用另一个我没有配置的数据库配置文件?我真的不知道。这有点令人沮丧,我想我不妨放弃使用框架......

你的帮助会很棒!谢谢。

【问题讨论】:

请删除唯一图标,然后尝试 不,还是没有运气... 你能把你的控制器代码贴在这里paste.ofcode.org并发送链接 实际上只有在编辑表单中出现此错误? 您在 ofcode.org 中粘贴的代码中有错字:[uses.user] 而不是 [users.user]。您确定错误是由用户名字段触发的吗?您尝试发送什么值? 【参考方案1】:

这可能/可能无济于事:您似乎在运行表单验证之后加载数据库。还有一个错字uses.user

【讨论】:

【参考方案2】:

在 Transact-SQL 中,单词“USER”是一个特殊的单词。尝试使用这样的反引号围绕 uses.user:

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

【讨论】:

【参考方案3】:

试试这个:-

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

【讨论】:

【参考方案4】:

它需要加载数据库。

$this->load->database();

【讨论】:

【参考方案5】:

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

显然,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-&gt;CI-&gt;db) 检查将始终返回 false

您也可以将该行放在库的构造函数中,但是您将在所有表单验证规则中实例化数据库库,这是不必要的(只有is_unique 需要它)。

【讨论】:

【参考方案6】:

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

为确保它仅在用户提交新值时运行,您可以将发布的值 $this-&gt;input-&gt;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);

【讨论】:

以上是关于CodeIgniter 的 is_unique 总是说值已经存在的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 的 is_unique 总是说值已经存在

唯一验证不起作用,我该怎么办?

在codeigniter中查找用户的总登录时间

如何在codeigniter中的用户之间分配总资金

分析codeIgniter.php文件

codeigniter 活动记录获取查询和不带 LIMIT 子句的查询