用户
 找回密码
 入住 CI 中国社区
搜索
查看: 1248|回复: 5
收起左侧

[讨论/交流] CI 表单验证类 matches 使用问题

[复制链接]
发表于 2016-11-6 17:20:00 | 显示全部楼层 |阅读模式
使用表单验证类中的matches 进行数据是否匹配验证时(假设存在$_POST['A'] = ‘a’,$_POST['B'] = ‘a’)
如果只对数据A进行了set_rules
$this->form_validation->set_rules('A', 'A',
    'trim|htmlspecialchars|required|matches[B]',
    array(
        'matches' => "Fail to match!"
    ));
而没有对数据B进行该操作,则会返回匹配失败,输出‘Fail to match’的错误信息

经过单步调试,发现CI 在 使用 matches 做验证时,使用了_field_data,而这个变量只有set_rules之后这个变量才会有与键相关联的值

对于上述假设,在_field_data中存在_field_data['A'] = a,
而不是把_POST数组(或者_GET数组)整个放进去

在matches的时候它会做如下检查
public function matches($str, $field)
{
   return isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])
      ? ($str === $this->_field_data[$field]['postdata'])
      : FALSE;
}
问题就出在这里,如果你没有set_rules,_field_data就没有_field_data[‘B’],自然就通不过检查,所以就返回了fals

不明为什么要做这样的设计?如此一来 matches 的使用就变得复杂了,对某些不需要对$_POST['B']设置验证规则的情况,容易出现莫名的错误,而且难以查证

发表于 2016-11-6 17:24:03 | 显示全部楼层
我觉得这样做的目的是让开发者验证所有用户输入,系统安全性和健壮性大大提高。
 楼主| 发表于 2016-11-9 07:24:35 | 显示全部楼层
健壮性可能是一个考虑,但是关键是 一 并没有在文档中说明这一点(也可能是我眼拙,没有注意到) 二 个人认为开发的主要目的并不是为了实现功能,而是为了满足客户的需要。的确有不需要全部验证的情况,不能直接就将这种情况排除在外啊。
发表于 2016-11-9 16:39:55 | 显示全部楼层
Anderson 发表于 2016-11-9 07:24
健壮性可能是一个考虑,但是关键是 一 并没有在文档中说明这一点(也可能是我眼拙,没有注意到) 二 个人认 ...

哈哈,可能 CI 的理念就是这样吧。不过 CI 提供了强大的扩展能力,不喜欢这种就自己动手改,我一般都是自己去改成我喜欢的样子。
发表于 2016-11-10 10:00:37 | 显示全部楼层
Hex 发表于 2016-11-9 16:39
哈哈,可能 CI 的理念就是这样吧。不过 CI 提供了强大的扩展能力,不喜欢这种就自己动手改,我一般都是自 ...

扩展能力确实强,可是不利于团队开发,,,可能是我这团队,没写文档的习惯把,,,搞的比较糟,,感觉ci自定义功能强大,
发表于 2016-11-10 10:34:07 | 显示全部楼层
余温 发表于 2016-11-10 10:00
扩展能力确实强,可是不利于团队开发,,,可能是我这团队,没写文档的习惯把,,,搞的比较糟,,感觉ci ...

确实,如果随意性太强,肯定是不利于团队开发,还是要有一些团队的规范。

本版积分规则