zentaoPHP框架中的数据验证机制

2010-08-24 10:52:34
王春生
39516
最后编辑:管西迎 于 2017-02-08 15:30:24
分享链接
摘要:zentaoPHP框架中的数据验证机制。

数据验证在web应用中尤其显得重要。下面来给大家介绍下禅道框架的数据验证机制。

一、验证规则放在什么地方?

mvc程序中,每一层都可以放验证规则。比如很多的表单验证,会自动根据用户的输入进行验证,然后给予提示。那么数据验证放在哪一层呢?这个问题网络上大家有很多的争议。有的人主要放在view这一层,有的则主张放在control层。zentaoPHP选择了model层。

为什么这样做呢?因为model层是底层,所有的数据操作,都要经过model来进行处理。那么只要在这一关把数据验证做好,就可以保证数据的准确和安全。当然,框架的用户,可以同时在前端加上js的验证,和model层的验证不会冲突的。下面来看下如何使用禅道的数据过滤机制。

二、zentaoPHP框架验证机制说明:

受php的filter机制启发,禅道的数据过滤分为两个部分,一个是数据修正,一个是数据验证。首先是要对从客户端传递过来的数据进行修正,然后再对数据进行校验。

验证类是在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方法就可以得到一个已经经过修改的完整的数据集合。这个集合已经可以准备入库了。让我们来看下数据是如何验证的。

四、数据检查

$this->dao->insert(TABLE_BUG)->data($bug)
->autoCheck()
->batchCheck('id, name', 'notempty')
->exec();
这句sql插入语句通过data方法,将修正过的数据传递给dao对象,然后通过autoCheck()对其进行自动检查。autoCheck会根据数据库里面字段的类型,长度进行判断。如果类型不对,或者长度不对,会自动记录错误。然后后面调用了batchCheck()方法,对一批字段进行非空的验证。

当然也可以通过check()方法对单个字段进行验证。验证的规则有很多,比如notempty, unique, email, account等等。

五、获得错误

如果数据验证过程中没有错误,则执行了exec()方法,将数据插入数据库。

如果有错呢?exec()方法什么都不会执行,但会记录到错误日志中。可以在control中里面判断是否有错误。

if(dao::isError()) die(js::error(dao::getError())); 

如果有错误,用js警告框的方式弹出,然后重置错误日志。

六、数据修正和数据检查方法附录

数据修正方法:

cleanEmail:    将目标字段处理为email
encodeURL:    将目标字段进行urlencode
cleanURL:     将目标字段中不符合url标准的字符去掉。
cleanFloat:   将目标字段处理为float类型。
cleanINT       将目标字段处理为int类型。
specialChars: 对目标字段使用htmlspecialchars处理。
stripTags:    去除目标字段中的标签。
quote:        对目标字段做quote处理。
setDefault:   对目标字段设置默认值。如果用户有传值,使用用户传的值。
setIF:        当满足某个条件的时候,对每个字段进行设置。
setForce:     强制覆盖某个字段的值。
remove:       删掉某一个字段。
removeIF:     满足某个条件的时候删除某一个字段。
add:          添加某一个字段。
addIF:        当满足某个条件的时候,添加某一个字段。
join:         对目标字段使用逗号连接起来。
callFunc:      使用自定义函数对数据进行修正。

数据检查方法:


bool:     目标字段必须是布尔型。
int:      目标字段必须是int类型。
float:    目标字段必须是float类型。
email:    目标字段必须是email类型。
url:      目标字段必须是url 类型。
ip:       目标字段必须是ip地址。有一个可选参数:$range all|public|static|private
date:    目标字段必须是一个日期格式。
reg:      目标字段必须满足正则表达式。
length:   长度要满足指定的大小。
notEmpty: 目标字段不能为空。
empty:    目标字段必须为空。
account:  目标字段必须是一个合法的用户名。
equal:    目标字段必须等于某一个值。
call:     调用用户自己的检查函数。 
评论列表
MOR 2022-08-09 10:02:40
『cause』不能为空。
新增模块后非空未翻译是因为什么原因,lang文件中已定义的对应的翻译
王春生 2022-08-11 08:27:43
参考我们默认模块的定义格式。应该是定义的key值,大小写之类的问题。
胖哥 2022-05-17 22:13:51
stripTags($this->config->project->editor->create['id'], $this->config->allowedTags)
这段code是什么意思?
MOR 2022-03-25 18:32:56
自动验证非空,字段名称没有翻译成lang文件中的文案,显示的直接是字段名称,是哪里配置不对吗
王春生 2022-03-29 17:03:10
需要翻译的。
元曦 2022-03-16 11:41:06
能否加一层验证层,怎么加,另外报错信息如何传给api呢
王春生 2022-03-18 09:58:06
你可以自己加。在control层加调用就好。
sunmaomao 2021-09-24 10:15:47
这个common:haspriv()代表着什么意思呢 为什么超链接也跳转不过来
王春生 2021-09-27 08:34:13
判断是否有访问权限。
于磊 2021-01-18 14:40:00
fix+check这个机制太巧妙了!
王春生 2021-01-25 16:26:26
哈哈,能得到大家的认可,开森。:)
小猿人 2019-12-11 17:54:22
怎么限制接收的参数,这样写的话,可能会多接收参数
王春生 2019-12-12 08:08:21
不需要的可以remove掉。
小猿人 2019-12-03 17:02:03
请问如何进行正则的验证
代学 2019-05-19 21:12:48
请问新版本禅道里加上这一句if(dao::isError()) die(js::error(dao::getError())); 为什么会弹两次窗呢?第一次是正常的XXX不能为空之类的,第二次弹出个parseerrorsyntaxerror:unexcepted token < in json at position 0,试了添加用户、创建项目等等好几个方法都是这样,.新版本不支持这种用法了吗?
王春生 2019-05-27 14:55:09
看一下我们其他的代码。
1/1
发表评论
评论通过审核后显示。