FleaPHP-FLEA_Helper_Validation的用法,初学者入门
当实看了下FLEA_Helper_Validation感觉比较复杂,而且表单又用JS验证,感觉没必要学了。
后来看了一文章,就是说客户端禁用JS,那JS难就不起作用了,还是要依靠PHP来难证,所以决心研究下FLEA_Helper_Validation
适合fleaphp入门者,力求写得易懂。
从头开始吧。
首先提交过来的表单应该是这种形式的
$data=array('username'=>'test','password'=>'123','email'=>'terry@163.com');
你可以dump($_POST)看下;
FLEA_Helper_Validation的目的就是对这些数据证,比如用户名,密码有什么规定(长度等),email是不是符合要求
写验证则,验证规则就是一个数组,把要验证的字段,及字段的要求,列上
中间为说明那个规则时的参考内容
<<<<<<<<<<<<<<<验证规则由多个规则组成,每个规则用于验证一个字段。
*
* 每个规则可以包含下列基本属性:
* name: 字段名
* type: 字段类型
* simpleType: 简单字段类型
* maxLength: 最大长度
* notNull: 是否不允许保存 NULL 值
* notEmpty: 是否不允许为空字符串
* binary: 是否是二进制数据
* unsigned: 是否是无符号数值
* hasDefault: 是否有默认值
* defaultValue: 默认值
*
* 如果 notNull 为 true,而 hasDefault 为 false,则表示该字段必须有内容。
*
* simpleType 属性可以有下列值:
* C - 长度小于等于 250 的字符串
* X - 长度大于 250 的字符串
* B - 二进制数据
* N - 数值或者浮点数
* D - 日期
* T - TimeStamp
* L - 逻辑布尔值
* I - 整数
* R - 自动增量或计数器
*
* 基本属性和利用 SDBO::metaColumns() 方法取得的字段信息完全一致。
* 因此可以直接将 metaColumns() 的返回结果作为验证规则。
*
* 为了获得更强的验证能力,还可以使用下列扩展属性:
*
* complexType: 复杂字段类型
* min: 最小值(仅用于数值型字段)
* max: 最大值(仅用于数值型字段)
* minLength: 最小长度(仅用于字符型和文本型字段)
* maxLength: 最大长度(仅用于字符行和文本型字段)
*
* 对于 complexType 属性,可以有下列值:
* NUMBER - 数值(整数、浮点数)
* INT - 整数
* ASCII - ASCII 字符串(所有编码小于等于 127 的字符)
* EMAIL - Email 地址
* DATE - 日期(所有 GNU Date Input Formats,例如 yyyy/mm/dd、yyyy-mm-dd)
* TIME - 时间(所有 GNU Date Input Formats,例如 hh:mm:ss)
* IPv4 - IPv4 地址(格式为 a.b.c.h)
* OCTAL - 八进制数值
* BINARY - 二进制数值
* HEX - 十六进制数值
* DOMAIN - Internet 域名
* ANY - 任意类型
* STRING - 字符串(等同于任意类型)
* ALPHANUM - 文字和数字(26个字母和0-9)
* ALPHA - 文字(26个字母)
* ALPHANUMX - 26个字母、10个数字以及 _ 符号>>>>>>>>>>>>>>>>>>>>>>>>>>>
下边是一个例子,这是验证规则中的其中一个规则,各项的表示的意思如下
array(
'name' => 'username', //表示验证username这个字段
'simpleType' => 'C', //长度小于等于 250 的字符串
'notNull' => 'true', //不能为空
'minLength' => 3, //最小长度
'maxLength' => 10, //最大长度
)
再来一个,各项表示如下:
array(
'name' => 'email', //表示验证email这个字段
'simpleType' => 'C', //表示长度小于250的字符
'complexType' => 'EMAIL', //复杂字段类型,且用于验证是不是emaol
'notNull' => true) //不能为空
现在我们应该知道了,规则的写法如下:
要验证的字段的名子name
然后就是写对这个字段有什么样的规则了,比如长度,能否为空,是不是合符的电子邮件
验证前做一些准备工作
FLEA::loadClass('FLEA_Helper_Verifier');
$objVerifier=&FLEA::getSingleton('FLEA_Helper_Verifier');
载入验证类,得到一个类的实例,按上边的要求写好规则,通常情况下我们验证的不只是一个字段。因此要写几个规则
例如我们想验证提交过来的username,password,email,可能的规则如下
$rules = array(
array(
'name' => 'username',
'simpleType' => 'C',
'notNull' => 'true',
'minLength' => 3,
'maxLength' => 10,
),
array(
'name' => 'password',
'simpleType' => 'C',
'notNull' => true,
'minLength' => 6,
'maxLength' => 15,
),
array(
'name' => 'email',
'simpleType' => 'C',
'complexType' => 'EMAIL',
'notNull' => true,
),);
假如提交过来的数据为
$_POST=array('usrname'=>'dd','password' => 'bd', 'email' => 'lwh#longdi.biz');
现在对数据按上边的规验证
$reults=$objVerifier->checkAll($data,$_POST);
dump($reults);
看下我们的规则及提交过来的数据,对于username要求最小长为3实际上长为2,肯定验证不通过,password也是如下,对于email,不是合法的邮件,所以验证也不会通过,我们看下输出的结果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Array
(
[username] => Array
(
[check] => minLength
[rule] => Array
(
[name] => username
[simpleType] => C
[notNull] => true
[minLength] => 3
[maxLength] => 10
)
)
[password] => Array
(
[check] => minLength
[rule] => Array
(
[name] => password
[simpleType] => C
[notNull] => 1
[minLength] => 6
[maxLength] => 15
)
)
[email] => Array
(
[check] => complexType
[rule] => Array
(
[name] => email
[simpleType] => C
[complexType] => EMAIL
[notNull] => 1
)
)
)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
其中check指明是什么问题。对于username问题为minLength,因为要求username的最小长为3,而实际的长度为2,所以minLength这项有问题,就用check指出来了
返回array中有哪项,表示哪项有问题。如果都符合规则,返回的是空array。
如果返回的数组不是空,说明验证没有通过了,具体为什么没通过呢?所以我们要处理返回的数组,有一种友好的方式显示结果
实际上我们要处理的仅仅是,针对以下编写友好提示
Array
(
[username] => Array
(
[check] => minLength
)
[password] => Array
(
[check] => minLength
)
[email] => Array
(
[check] => complexType
)
)
下边是一段处理程序,参考了论坛上网友的例子,在此表示感谢
var $tips = array(
'notNull' => '不可为空。',
'minLength' => '长度不够。',
'maxLength' => '长度过大。',
);
function setTip($result) {
//$result为0表示测试通过
if (count($result) == 0)
return $result;
foreach ($result as $field=>&$unit) {
$key = $unit['check'];
if ($key == 'complexType') {
$unit['tip']='邮箱格式不正确';
} else {
if (array_key_exists($key, $this->tips)) {
switch ($field)
{
case 'username':
$unit['tip'] = "用户名".$this->tips[$key];
break;
case 'password':
$unit['tip'] = "密码".$this->tips[$key];
break;
case 'email':
$unit['tip'] = "邮箱".$this->tips[$key];
break;
default:
$unit['tip'] = "未知字段".$this->tips[$key];
break;
}
}
}
}
return $result;//至少是个空数组
}
这样子处处里数组中就会多一个tip,可以针对实际情况,输出tip
附测试用的完整的代码
<?php
/**
* 程序默认的控制器
*/
class Controller_Default extends FLEA_Controller_Action
{
/**
* 主要是测试verifed助手
*
*/
var $tips = array(
'notNull' => '不可为空。',
'minLength' => '长度不够。',
'maxLength' => '长度过大。',
);
function setTip($result) {
//$result为0表示测试通过
if (count($result) == 0)
return $result;
foreach ($result as $field=>&$unit) {
$key = $unit['check'];
if ($key == 'complexType') {
$unit['tip']='邮箱格式不正确';
} else {
if (array_key_exists($key, $this->tips)) {
switch ($field)
{
case 'username':
$unit['tip'] = "用户名".$this->tips[$key];
break;
case 'password':
$unit['tip'] = "密码".$this->tips[$key];
break;
case 'email':
$unit['tip'] = "邮箱".$this->tips[$key];
break;
default:
$unit['tip'] = "未知字段".$this->tips[$key];
break;
}
}
}
}
return $result;//至少是个空数组
}
function actionIndex()
{
FLEA::loadClass('FLEA_Helper_Verifier');
$objVerifier=&FLEA::getSingleton('FLEA_Helper_Verifier');
$data = array('username'=>'fb','password' => 'bffb', 'email' => 'lwh#longdi.biz');
$roles = array(
array(
'name' => 'username',
'simpleType' => 'C',
'notNull' => 'true',
'minLength' => 3,
'maxLength' => 10,
),
array(
'name' => 'password',
'simpleType' => 'C',
'notNull' => true,
'minLength' => 6,
'maxLength' => 15,
),
array(
'name' => 'email',
'simpleType' => 'C',
'complexType' => 'EMAIL',
'notNull' => true,
),);
$reults=$objVerifier->checkAll($data,$roles);
$reult=$this->setTip($reults);
dump($reult);
// echo $reult['username']['tip'];
}
}
?>