php字段验证规则,ThinkPHP 自动验证及验证规则详解

本文详细介绍了ThinkPHP框架中的自动验证和自动填充功能。自动验证涉及必须字段、邮箱格式、唯一性等规则,并通过$_validate属性定义。自动填充则用于处理默认值和数据过滤,通过$_auto属性设置。文中还展示了如何动态改变验证规则和填充规则,以及在M方法中实现自动验证和填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThinkPHP 自动验证及验证规则详解

ThinkPHP 自动验证

ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证。自动验证是基于数据对象的,而大多情况下数据对象是基于

$_POST表单 (不是绝对的)创建的。

基本的自动验证功能包括:必须字段、email邮箱格式、唯一性、URL地址、数字、两个字段是否相同、是否等于某个值等。

要使用系统的自动验证功能,只需要在对应的 Model类 里面定义 $_validate

属性(由多个验证因子组成的数组),语法如下:

protected $_validate = array(

array(验证字段,验证规则,错误提示[,验证条件][,附加规则][,验证时间])

};

ThinkPHP自动验证格式说明:

验证因子

说明

验证字段

必须。需要验证的表单字段名称,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如验证码等。

验证规则

必须。要进行验证的规则,需要联合附加规则一起使用。

错误提示

必须。当验证不通过时的提示信息。

验证条件

可选。包括:

Model::EXISTS_TO_VAILIDATE 或者 0 :存在字段就验证(默认)

Model::MUST_TO_VALIDATE 或者 1 :必须验证

Model::VALUE_TO_VAILIDATE 或者 2 :值不为空的时候验证

附加规则

可选。配合验证规则使用,包括:

regex:使用正则进行验证,表示前面定义的验证规则是一个正则表达式(默认)

unique:验证唯一性,系统会根据字段目前的值查询数据库来判断是否存在相同的值

confirm:验证表单中的两个字段是否相同,前面定义的验证规则是一个字段名

equal:验证是否等于某个值,该值由前面的验证规则定义

in:验证是否在某个范围内,前面定义的验证规则必须是一个数组

function:使用函数验证,表示前面定义的验证规则是一个函数名

callback:使用方法验证,前面定义的验证规则是当前 Model 类的一个方法

验证时间

可选。包括:

Model:: MODEL_INSERT 或者 1 :新增数据时候验证

Model:: MODEL_UPDATE 或者 2 :编辑数据时候验证

Model:: MODEL_BOTH 或者 3 :全部情况下验证(默认)

自动验证例子

下面的例子验证文章标题必须填写且检测标题是否已存在:

class ArticleModel extends Model{

protected $_validate = array(

array('title','require','标题不能为空!'),

array('title','','标题已经存在!',0,'unique',1),

};

}

在操作中,当使用 create 方法创建数据对象时会自动进行数据验证操作(当 POST 提交表单处理时):

$Article = D("Article");

if (!$Article->create()){

// 如果创建失败,表示验证没有通过(注:可能原因之一)输出错误提示信息

exit($Article->getError());

}else{

// 验证通过,继续下一步流程如将数据写入数据表

}

系统内置了一些常用正则验证的规则,包括:require(必须)、email(邮箱格式)、url(URL地址)、currency(货币)、number(数字)、qq(QQ号码)、english(英文字符),可以直接使用。

出于用户体验考虑,$Article->getError() 返回的错误提示信息,一般以 Ajax

方式返回,详细参见《ThinkPHP Ajax》。

定义自己的验证规则

当内置的这些验证规则无法满足验证要求是,可以定义自己的验证规则,如要求出生年月以 2000-1-1 格式输入时:

array('birthday','/^d{4}-d{1,2}-d{1,2}$/','出生年月格式错误!'),

可见,只需几行简单的代码,就实现了各种不同方式的表单验证,灵活使用 ThinkPHP

自动验证,可以让开发过程事半功倍。更多自动验证列子,参见本节内容之《ThinkPHP

自动验证实例》。

---------------------------------------------------------------------------------------

ThinkPHP 自动填充

ThinkPHP 内置了数据对象的自动填充功能,可以用来处理默认值、数据过滤以及其他系统写入字段的自动处理。

要使用自动填充功能,只需要在对应的 Model类 里面定义 $_auto

属性(由多个验证因子组成的数组)。$_auto 属性是由多个填充因子组成的数组,语法格式如下:

protected $_auto = array(

array(填充字段,填充内容[,填充条件][,附加规则])

};

ThinkPHP自动填充格式说明:

填充因子

说明

填充字段

必须。需要填充的表单字段,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如验证码等。

填充内容

必须。要对字段自动填充的内容。

填充条件

可选。包括:

Model:: MODEL_INSERT 或者 1 :新增数据时候填充(默认)

Model:: MODEL_UPDATE 或者 2 :更新数据时候填充

Model:: MODEL_BOTH 或者 3 :全部情况下填充

附加规则

可选。包括:

string:字符串,表示填充内容为字符串(默认)

function:使用函数,表示填充的内容是一个函数返回值

callback:使用方法,表示填充的内容是一个当前 Model 的方法返回值

field:字段,表示填充的内容是一个其他字段的值

自动填充例子

用户注册或修改资料时,可能用到的自动填充例子:

class UserModel extends Model{

protected $_auto = array (

// 新增的时候把status字段设置为1

array('status','1'),

// 对password字段在所有情况下使用md5函数处理

array('password','md5',3,'function'),

// 对username字段在新增时回调getName方法

array('username','getName',1,'callback'),

// 对regdate字段在新增时写入当前时间戳

array('regdate','time',1,'function'),

// 对regip字段在新增时写入用户注册IP地址

array('regip','get_client_ip',1,'function'),

);

}

和自动验证一样,自动完成机制需要使用 create 方法才能生效:

$Article = D("User");

if(!$User->create()){

// 如果创建数据对象失败(可能是验证未通过等),输出错误提示信息

exit($Article->getError());

}else{

// 继续下一步流程如将数据写入数据表

}

提示

与自动验证不同的是,自动填充无效时(如调用一个不存在的函数或自动填充的字段不存在等)并不导致创建数据对象(create())失败,只能通过调试或实际数据入库来检测自动填充是否正确有效。

动态改变自动完成规则

和自动验证一样,可以在操作方法中使用 setProperty方法 动态的更改自动完成的规则:

$Dao = D("User");

$auto = array (

// 仅对password字段进行处理

array('password','md5',1,'function')

);

$User->setProperty("_auto",$auto);

if(!$User->create()){

……

}

M方法中使用自动填充功能

充分利用功能强大的 ThinkPHP

自动填充(自动完成)功能,能够快捷简便的构建表单入库数据,程序结构也会更加明晰。

----------------------------------------------------------------------------------

动态验证 setProperty 方法

通常来说,每个数据表对应的验证规则是相对固定的,但是在某些特殊的情况下面可能会改变验证规则。ThinkPHP 的 Model类

提供了 setProperty 方法,可以在操作中使用 setProperty 方法动态改变验证规则来满足不同条件下的验证:

setProperty 方法用于设置模型的属性值,语法如下:

setProperty(string name, mixed value)

例子:

$Article = D("Article");

$validate = array(

array('title','require','标题不能为空!',1), // 仅需验证标题不能为空

);

$Article->setProperty("_validate",$validate);

if (!$Article->create()){

// 如果创建失败,表示验证没有通过(注:可能原因之一)输出错误提示信息

exit($Article->getError());

}else{

// 验证通过,继续下一步流程如将数据写入数据表

}

上面的例子在操作里动态改变了原有的验证规则,从而实现不同条件下的自动验证。

提示

在操作中动态改变验证规则后,新的规则将直接覆盖原有的验证规则。ThinkPHP

还没有支持动态改变规则时对原有规则的追加、增减或者替换等更加灵活的动态改变方式。

-----------------------------------------------------------------

ThinkPHP M方法实现自动验证与自动填充

通常,我们会将自动验证与自动填充规则写入模型类里,然后再用 D 方法实例化模型类来实现对表单的自动验证与自动填充功能。由于 M

方法只是实例化基础模型类而不会去实现模型类里定义的逻辑,因此 M 方法一般情况下是无法完成自动验证与自动填充的。

ThinkPHP 提供的 setProperty 方法,可以动态更改 Model 的属性。在操作中,利用 setProperty

方法便可以在使用 M 方法(不创建模型类)时实现自动验证与自动填充功能。

setProperty 方法是 Model 类的内置方法,用于设置模型的属性值,语法如下:

setProperty(string name, mixed value)

例子:

$Article = M("Article");

// 自动验证规则

$validate = array(

array('title','require','标题不能为空!',1),

array('title','','标题已经存在',0,'unique',1),

array('content','require','内容必须',1),

);

// 自动填充规则

$_auto = array(

// 新增癿时候把 status 字段设置为 1

array('status','1',self::MODEL_INSERT),

// 新增癿时候把 create_time 字段设置为 time() 时间戳

array('create_time','time',self::MODEL_INSERT,'function'),

);

$Article->setProperty("_validate",$validate);

$Article->setProperty('_auto',$auto);

// 创建数据对象

if ($Article->create()){

// 创建数据对象成功,写入数据

$User->add();

}else{

// 创建数据对象失败

exit($Article->getError());

}

要在 M 方法中使用自动验证与自动填充,需要以数据对象的方式(create())写入数据,更多信息参见《ThinkPHP create 方法:表单数据智能写入》。

原则上讲,应该将自动验证与自动填充等逻辑在模型里面来完成,但 ThinkPHP 提供了 setProperty

方法,以方便在其他特殊情况(如使用 M 方法时)时也能实现自动验证与自动填充功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值