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]');
我的数据库有一个表users
和user
是其中的一个字段,所以我不知道我做错了什么,或者问题是什么。该表是空的(但我也尝试过使用它有记录)并且在 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->CI->db)
检查将始终返回 false
您也可以将该行放在库的构造函数中,但是您将在所有表单验证规则中实例化数据库库,这是不必要的(只有is_unique
需要它)。
【讨论】:
【参考方案6】:以您的代码为例,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);
【讨论】:
以上是关于CodeIgniter 的 is_unique 总是说值已经存在的主要内容,如果未能解决你的问题,请参考以下文章