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

时间:2020-01-09 14:46:53

标签: php codeigniter validation query-builder

我有几个基于Codeigniter的项目,在这些项目上我做过完全相同的事情,但是由于某些原因,在最近的项目中我无法使其正常工作。

我在CI核心上直接进行了一些自定义(是的,我知道我应该扩展该核心而不是对其进行修改,但是到目前为止,它已经奏效了,这使得在进行所有修改后就可以轻松地开始一个新项目。 )。这些修改之一是Form_validation库(system/libraries/Form_validation)上的另一种方法,称为is_unique_sc,该方法可以检查表中是否不存在已提交的字段(就像常规{ {1}}方法)的唯一区别是允许使用is_unique参数而不是schema.table.field(这是必需的,因为我从事的许多项目都需要使用多个单独的模式)

这是自定义方法

table.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

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

如果有人可以帮助我指出问题所在,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

在遗忘了数月之后(我通过其他方法解决了验证失败的问题),我再次刺中了它并将其破解!

在最新版本的CI3中,似乎存在一个错误,导致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;
}

总是会返回false(并因此使表单验证失败),因为isset($this->CI->db)总是返回布尔值FALSE,而与所有与数据库相关的东西都自动加载和查询生成器无关保持活跃。

修复很简单。函数本身中只有一行代码:

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;
}

添加单行后,表单验证再次开始正常工作。如果$this->CI->load->database()失败,它仍然会失败,考虑到is_unique规则(以及我自己的自定义规则)取决于能够运行查询,这是可以预期的。但是只要数据库连接可用,该规则就可以工作!