- 1 认识 zentaoPHP 框架
- 2 入口文件
- 3 配置管理
- 4 模块管理
- 4.1 控制器(control)
- 4.2 业务逻辑(model)
- 4.2.1 定义 model
- 4.2.2 跨模块调用
- 4.2.3 删除记录
- 4.2.4 数据处理对象 dao
- 4.3 模版视图(view)
- 4.4 从 hello world 开始
- 4.5 模块的配置
- 4.6 模块的语言
- 4.7 模块的 CSS 和 JS 管理
- 5 类库
- 6 扩展机制
- 6.1 扩展机制简介
- 6.2 新增独立模块
- 6.3 对控制层(control)扩展
- 6.4 对模型层(model)扩展
- 6.5 对视图层(view)扩展
- 6.6 对样式表和js进行扩展
- 6.7 对语言配置进行扩展
数据验证类
- 2021-09-27 11:01:49
- admin
- 505
- 最后编辑:admin 于 2021-12-14 13:49:18
数据验证在 web 应用中尤其显得重要。下面来给大家介绍下禅道框架的数据验证机制。
一、验证规则放在什么地方?
mvc 程序中,每一层都可以放验证规则。比如很多的表单验证,会自动根据用户的输入进行验证,然后给予提示。那么数据验证放在哪一层呢?这个问题网络上大家有很多的争议。有的人主要放在 view 这一层,有的则主张放在control 层。zentaoPHP 选择了 model 层。
为什么这样做呢?因为 model 层是底层,所有的数据操作,都要经过 model 来进行处理。那么只要在这一关把数据验证做好,就可以保证数据的准确和安全。当然,框架的用户,可以同时在前端加上js的验证,和 model 层的验证不会冲突的。下面来看下如何使用 zentaoPHP 的数据过滤机制。
二、zentaoPHP 框架验证机制说明
受 php 的 filter 机制启发,zentaoPHP 的数据过滤分为两个部分,一个是数据修正,一个是数据验证。首先是要对从客户端传递过来的数据进行修正,然后再对数据进行校验。
验证类是在lib/filter/filter.class.php里面定义的。
三、数据修正
首先来看代码:
$bug = fixer::input('post') ->add('openedBy', $this->app->user->account) ->add('openedDate', $now) ->setDefault('project,story,task', 0) ->setDefault('openedBuild', '') ->setIF($this->post->assignedTo != '', 'assignedDate', $now) ->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story)) ->specialChars('title,steps,keyword') ->cleanInt('product, module, severity') ->join('openedBuild', ',') ->remove('files, labels') ->get();
首先,是调用 fixer 这个类的 input 方法,它的参数post表示是从 $_POST 这个变量中获取数据。
紧接着的两行 add(),是向数据中增加两个变量。
然后后面的两行 setDefault 则是表示,当这个变量没有传值的时候,设成默认的值。
接下来是两行setIF。setIF 共有三个参数,第一个是判断条件,后面两个分别是 key 和 value。也就是当条件为 true 的时候,设置 $key = $value。
下面的 spechialchars 则表示对这三个字段进行 htmlspecialchars 处理;cleanInt 则将变量处理成 int 类型,join,则将 openedBuild 使用,连接起来。
后,还需要把两个不需要的变量去掉,使用 remove。
通过 get 方法就可以得到一个已经经过修改的完整的数据集合。这个集合已经可以准备入库了。让我们来看下数据是如何验证的。
数据修正方法:
cleanEmail: 将目标字段处理为email encodeURL: 将目标字段进行urlencode cleanURL: 将目标字段中不符合url标准的字符去掉。 cleanFloat: 将目标字段处理为float类型。 cleanINT 将目标字段处理为int类型。 specialChars: 对目标字段使用htmlspecialchars处理。 stripTags: 去除目标字段中的标签。 quote: 对目标字段做quote处理。 setDefault: 对目标字段设置默认值。如果用户有传值,使用用户传的值。 setIF: 当满足某个条件的时候,对每个字段进行设置。 setForce: 强制覆盖某个字段的值。 remove: 删掉某一个字段。 removeIF: 满足某个条件的时候删除某一个字段。 add: 添加某一个字段。 addIF: 当满足某个条件的时候,添加某一个字段。 join: 对目标字段使用逗号连接起来。 callFunc: 使用自定义函数对数据进行修正。
四、数据检查
在 dao 类中定义了对数据字段的检查方法,主要是以下5个:
autoCheck()、check()、checkIF、batchCheck()、batchCheckIF()
例如:
$this->dao->insert(TABLE_BUG)->data($bug) ->autoCheck() ->batchCheck('id, name', 'notempty') ->exec();
这句sql插入语句通过 data 方法,将修正过的数据传递给 dao 对象,然后通过 autoCheck() 对其进行自动检查。autoCheck() 会根据数据库里面字段的类型,长度进行判断。如果类型不对,或者长度不对,会自动记录错误。然后后面调用了 batchCheck() 方法,对一批字段进行非空的验证。
当然也可以通过 check() 方法对单个字段进行验证。验证的规则有很多,比如 notempty, unique, email, account 等等。
checkIF() 方法是当指定条件成立时,才进行 check 操作。该方法有三个参数,依次是:条件, 字段, 规则。
例如:
->checkIF($this->post->email != '', 'email', 'email')
batchCheckIF() 方法同理。
五、获得错误
如果数据验证过程中没有错误,则执行了exec()方法,将数据插入数据库。
如果有错呢?exec()方法什么都不会执行,但会记录到错误日志中。可以在control中里面判断是否有错误。
if(dao::isError()) die(js::error(dao::getError()));
如果有错误,用 js 警告框的方式弹出,然后重置错误日志。