我正在使用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使用我尚未配置的另一个db配置文件?我真的不知道。这有点令人沮丧,我想我也可以放弃使用框架......
你的帮助会很棒!感谢。
答案 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);