codecamp

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:     调用用户自己的检查函数。 
zentaoPHP框架的分页解决方案
第一讲:MVC概念
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }