我有几个基于 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 中搜索了很多类似的案例,但到目前为止没有任何解决方案有帮助。
如果有人可以帮助我查明问题,我将非常感激。
紫衣仙女