【问题标题】:CodeIgniter's is_unique always saying value already existsCodeIgniter 的 is_unique 总是说值已经存在
【发布时间】: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]。您确定错误是由用户名字段触发的吗?您尝试发送什么值?

标签: php mysql forms validation codeigniter


【解决方案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);
            

            【讨论】:

              猜你喜欢
              • 2017-07-03
              • 1970-01-01
              • 1970-01-01
              • 2016-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-28
              • 2012-05-13
              相关资源
              最近更新 更多