发新话题
打印

FleaPHP-FLEA_Helper_Validation的用法,初学者入门

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'];
    }
}
?>
空间出租:P4 3.0+1G+RIAD 1 160G+PHP+IIS+MYSQL+MDaemon

QQ:126682182
Email:hhyisw@163.com
Home:http://www.stksky.com

TOP

发新话题