5.5 共通功能——使用Zend_Validate进行输入数据的检查
在上一节中已经提到过,当终端用户将浏览器上的JavaScript等脚本检查设置为禁用时,再完美的客户端输入检查都将不被执行了。这样怀有恶意的用户,就能将各种非法的数据登录到数据库中了,这对网站的安全是很大的威胁。
因此,客户端脚本检查尽管有速度快等优点,光有客户端脚本检查是很不够的,有时候必须在服务器端再追加与客户端脚本一样的检查。本节将介绍如何使用Zend_Validate组件来编写服务器端检查程序,如图所示。
要点
CheckUtil.class.php与上一节的CheckUtil.js一样,是集中了进行输入数据检查方法的功能性类。
Zend Framework中有检查用的组件Zend_Validate,单独使用它,不是太好使用。本节中将利用Zend_Validate的检查功能,然后加上错误信息以及其错误的显示功能,来完成整个检查类。表5-3所示的是CheckUtil.class.php中定义的方法。
表5-3 CheckUtil.class.php中定义的方法
CheckUtil.class.php是功能型类,使用方法请见本节后的补充资料。
目录结构
代码
定义放置错误信息的变量$_error。
定义毁坏方法,在其中加入关闭数据库连接。
定义构造方法,在构造方法中初始化错误信息容纳变量。
取得/设定私有变量$error值得访问方法。setError方法在数组的最后追加指定的错误信息。
数组$this->_error中含有错误信息(错误信息的数目1以上)的情况下,将数组放置到模板变量errors中,且调用error.tpl来显示错误信息,最后终止处理。此处特意以comment的方式保留了一段代码,其实不仅可以将错误信息显示在错误页面上时,也可以以字符串的形式返回,再以其他形式显示出来。这段代码就是将错误信息转化为字符串的。
checkError方法是各个XxxxCheck方法中内部调用的私有方法。将Zend_Validate_Xxxx对象与检查对象值以参数传入,进行值的合法性检查。
如果发生输入错误,使用getMessages方法取得所有的错误信息,并用循环将错误信息放置到$_error数组中。
requiredCheck方法对文字输入框等进行必须输入检查。没有输入时,将显示错误信息。使用setMessage方法事先设置发生错误时的错误信息。实际的检查由私有方法checkError完成。后面的其他检查函数都是相同的过程。
lengthCheck方法对输入字符串进行是否超过了指定长度的检查。Zend_Validate_StringLength类提供字符串长度的检查。此类本来是用来检查最大与最小长度的,此处将最小长度设为0。
另外,请注意在错误提示信息中是否含有“%max%”的字符串。这是Zend_Validate中设置的预约位置,会自动置换为检查对象字符串。可使用的预约位置,随着Zend_Validate_Xxxx类的不同而不同,可参照本节后的补充资料。
numberTypeCheck方法进行是否是数字的检查。数字检查具体由Zend_Validate_Digits类完成。
dateTypeCheck方法是进行日期格式的数据检查的。具体由Zend_Validate_Date类来完成日期格式的检查。
与上面的dateTypeCheck方法一样,dateNumberTypeCheck方法也进行日期型数据检查,不同的是此方法可以指定年月日。
rangeCheck方法是对数据进行是否在指定数值范围检查。具体的检查工作由Zend_Validate_Between类来完成。
regExCheck方法用于检查字符串是否符合给定的正则表达式。可用于E-mail或URL等复杂字符的检查。正则表达式检查功能由Zend_Validate_Regex类提供。
compareCheck方法是进行大小比较检查的,当第一个值$value1大于等于第二个值$value2,则返回错误信息。
checkUser方法是自定义函数,判断指定的用户名是否已经被注册。
checkMail方法也是自定义函数,判断指定的邮件地址是否已经登录。
duplicateCheck是进行判断是否重复登录的方法。自定义。
错误发生时,用于显示错误信息的共通页面。利用JavaScript的功能打开显示错误信息的窗口,并在该窗口中显示收集到的所有错误信息。
补充
注意事项
Zend_Validate组件中的Zend_Validate_StringLength类的内部,使用了iconv_strlen函数来取得字符串长度。iconv_strlen函数是利用php.ini中的iconv.internal_encoding参数中设定的字符代码来换算字符串长度的。因此使用时,千万要注意设定iconv.internal_encoding参数。
如果按照第1章介绍的步骤进行环境配置的话,不用进行其他额外的特别配置了。
CheckUtil.class.php的使用方法
上述的使用过程都是一些固定模式,使用CheckUtil.class.php时,就算检查的项目数目增加,程序的修改也非常单纯。
Zend_Validate组件提供的检查功能
在Zend_Validate组件中,根据检查的内容不同,提供了各种各样的Validate类(Zend_Validate_Xxxxx),下面罗列了Zend_Validate组件中可以利用的各种Validate类。
列表中的类名是除了“Zend_Validate_”外的名称,另外,参数是传给Validate类的构造方法的。Zend_Validate组件如表5-4所示。
表5-4 Zend_Validate组件一览
在Zend_Validate组件中,可能含有留有与检查参数对应的留置位(place holder)的错误信息(例如,对Zend_Validate_GreaterThan类来说,错误信息中含有“%min%”的留置位)。
在Validate类中设定了必要的参数后,使用isValid方法来判断检查是否成功。如果发生了错误,可用getMessages方法取得错误信息。
Validat类的错误信息
在前面的CheckUtil.class.php文件中,调用Validate类的getMessage方法时,有时会返回多个错误信息,请务必注意。
表5-5列举了Validate类中的错误信息种类。
表5-5 Validate类中的错误代码种类
错误代码是,setMessage方法中设定错误信息时,为识别错误种类用的代码。
参照CheckUtil.class.php文件中的第47行,在setMessage方法的第2参数指定错误代码后,就能为特定错误设定特定的错误信息。第2参数省略时,按照默认的错误代码设定错误信息。
知识专栏:PHP的开发支援环境——Zend Studio for Eclipse
在PHP应用程序的开发过程中,如果想导入简单的IDE,4.10节后介绍的Aptana Studio是一个很好的选择。但是,Aptana Studio的正式版本刚刚发布,还有很多让用户不满意的不足的地方。
这样,如果确实想在PHP的应用程序开发时使用IDE,你还可以选择Zend Studio for Eclipse(http://www.zend.com/product/eclipse.html)。
Zend Studio for Eclipse具备了从代码自动生成、HTML WYSIWYG编辑器、单元测试、代码管理、探查等开发时需要的主要功能,以及优秀的开发环境。标准对应使用Zend Framework进行开发。进行真正的PHP综合应用系统的开发工作时,Zend Studio for Eclipse是个不错的选择。
共有条评论 网友评论