Codeigniter 自定义表单验证规则返回误报

我有几个基于 Codeigniter 的项目,我在这些项目上做了完全相同的事情,但由于某种原因,在最近的项目中我无法让它工作。


我直接在 CI 核心上进行了一些自定义(是的,我知道我应该扩展核心而不是修改它,但它到目前为止一直有效,并且它可以更容易地启动一个所有修改都已经到位的新项目)。其中一个修改是调用Form_validation库(需要,因为我从事的许多项目都需要使用多个单独的模式)system/libraries/Form_validationis_unique_scis_uniqueschema.table.fieldtable.field


这是自定义方法


public function is_unique_sc($str, $field)

{

    sscanf($field, '%[^.].%[^.].%[^.]', $schema, $table, $field);

    return isset($this->CI->db)

            ? ($this->CI->db->limit(1)->get_where($schema.'.'.$table, array($field => $str))->num_rows() === 0)

            : FALSE;

}

为了比较,这是原始is_unique方法:


public function is_unique($str, $field)

{

    sscanf($field, '%[^.].%[^.]', $table, $field);

    return isset($this->CI->db)

        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)

        : FALSE;

}

form_validation_lang如果验证返回,这将伴随对语言文件的必要修改false:


$lang['form_validation_is_unique_sc']       = 'The {field} field must contain a unique value.';

就像我说的,我在许多迄今为止没有问题的项目上使用它。


但是,在我最近的项目中,由于以下规则,新用户创建失败:


$this->form_validation->set_rules('new_email', 'Mail', 'required|trim|htmlspecialchars|strtolower|valid_email|is_unique_sc[accv_users.controllers.controller_email]');

即使用户输入的电子邮件实际上是唯一的,该is_unique_sc规则也会始终返回(并因此显示其验证错误消息)。false删除is_unique_sc规则允许语句的其余部分正确验证,从而消除整个set_rules语句具有不正确字段名称的可能性。


我有双重和三重检查架构名称是accv_users,表名称是controllers,字段名称是controller_email。查询生成器按方法要求启用,并且数据库连接已正确配置且可用。


检查sscanf()函数的输出是否正确地将模式名称分配给$schema,表名称分配给 ,$table字段名称分配给$field


为了完整起见,这是表单视图中的字段:


<div class="col-12 col-lg-3">

   <input class="form-control" type="email" id="new_email" name="new_email" placeholder="Mail" required>

</div>

预期的结果当然是,当使用表中不存在的电子邮件提交表单时,验证通过。只有当电子邮件已经在桌面上时,验证才会失败。我在 SO 中搜索了很多类似的案例,但到目前为止没有任何解决方案有帮助。


如果有人可以帮助我查明问题,我将非常感激。


慕码人2483693
浏览 142回答 1
1回答

紫衣仙女

经过几个月的遗忘(我通过其他方式解决了这个失败的验证),我再次尝试并破解了它!似乎在最新版本的 CI3 中,有一个错误会阻止is_unique表单验证规则正确运行。我做了一些深入的挖掘,最终发现了这个功能:public function is_unique($str, $field){&nbsp; &nbsp; sscanf($field, '%[^.].%[^.]', $table, $field);&nbsp; &nbsp; return isset($this->CI->db)&nbsp; &nbsp; &nbsp; &nbsp; ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)&nbsp; &nbsp; &nbsp; &nbsp; : FALSE;}总是会返回false(因此,使表单验证失败),因为isset($this->CI->db)总是返回一个 boolean FALSE,无论所有与数据库相关的东西都被自动加载并且查询生成器处于活动状态。修复很简单。函数本身只有一行代码:public function is_unique($str, $field){&nbsp; &nbsp; sscanf($field, '%[^.].%[^.]', $table, $field);&nbsp; &nbsp; // add the following line&nbsp; &nbsp; $this->CI->load->database();&nbsp; &nbsp; return isset($this->CI->db)&nbsp; &nbsp; &nbsp; &nbsp; ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)&nbsp; &nbsp; &nbsp; &nbsp; : FALSE;}添加该单行后,表单验证再次开始正常工作。如果$this->CI->load->database()失败,它仍然会失败,考虑到is_unique规则(以及我自己的自定义规则)取决于能够运行查询,这是可以预料的。但只要数据库连接可用,规则就有效!
打开App,查看更多内容
随时随地看视频慕课网APP