如何使用thinkphp的model来验证前端表单?

为了增加安全性, 在向model表中写入和修改数据时, 最好是调用 create方法来保证安全, 然后再调用add和save方法:

if($Model->Validate($validate)->create()){
...
$Model->add(..); || $Model->save(...);
...
}else{
$Model->getError(..);

}

关于类的定义中的const?

类中的常量通常用const常量, 而且是大写的来表示, 使用时, 采用self::CONSTANT_NAME, 如:

class Model {
    // 操作状态
    const MODEL_INSERT          =   1;      //  插入模型数据
    const MODEL_UPDATE          =   2;      //  更新模型数据
    const MODEL_BOTH            =   3;      //  包含上面两种方式
    const MUST_VALIDATE         =   1;      // 必须验证
    const EXISTS_VALIDATE       =   0;      // 表单存在字段则验证
    const VALUE_VALIDATE        =   2;      // 表单值不为空则验证

在Application的Model文件夹中, 通常没有自定义的模型类, 因为, 你没有自定义的, 自己需要的对 表->表单 的自动验证, 自动完成等功能, 你可以直接使用Model类自己直接提供的方法和常量, 包括add, save, self::EXISTS_VALIDATE等都可以在app的模型中直接 使用, 但是如同跟其他类的继承的使用方法, 如要在继承的子类中定义自己的验证方法, 则要 "覆盖"override父类的这些成员属性:

// 实际上, 这些属性本身都是父类自己所具有的,  只是为空, 所以在子类中,只是重写 override这些父类的属性...
    protected $_validate        =   array();  // 自动验证定义
    protected $_auto            =   array();  // 自动完成定义
    protected $_map             =   array();  // 字段映射定义
    protected $_scope           =   array();  // 命名范围定义
    // 是否自动检测数据表字段信息

验证规则的写法:

$_validate = array(
    array('验证字段1', 验证规则, '错误提示', [验证条件, 附加规则, 验证时间] ),
    array(验证字段2, 验证规则, 错误提示, [验证条件, 附加规则, 验证时间] ),
    array(验证字段3, 验证规则, 错误提示, [验证条件, 附加规则, 验证时间] ),...
);

// 验证字段, 一定要加引号的;
// 验证规则, 是自己写的, 如 数字, 数组, 字符串等等, 当然, 你也可以使用 tp内置的验证规则, 包括: require,number, email, url,currency等,到底有多少内置的验证规则, 看源代码就知道了: 实际上, 你还可以指定 整数, 双精度数字, 英文字符: interger, 'double', 'english'...

// 附加的验证规则, 是对前面的验证规则的一个 "说明/补充"...如: function, callback, regex, in, notin, between, notbetween, length(前面的验证规则表示输入的字符串的长度个数),
主要是以下几个的说明:

  • confirm: 是对当前验证字段, 和前面的某个字段, 是否是一样的,
  • unique: 就是验证输入的字段值,在当前表中,是否是唯一的, 即是否已经有同样的值了, 那么前面的验证规则就应该设置为'' 空;

验证的方式,分为静态验证和动态验证, 如果你只是对 前端表单 进行验证, 则不必创建一个专门的UserModel类, 可以使用 Think\Model父类自己就有的validate方法, 这时候, 就可以直接用M方法, 而不必用D方法 (D方法 就等于 new \Home\UserModel();). 此时, 验证规则就是一个普通的数组变量, 不是成员变量: $rules= array(..); $User=M('user'); $User->validate($rules); 这里的$rules不是 $_validate了. 这样做就比较简洁省事...

posted @ 2017-04-01 10:20  noitanym  阅读(1739)  评论(0编辑  收藏  举报