class ManagerModel extends Model{
//自动验证的时候,thinkpphp为我们封装的是一个成员属性。在create的时候,内部会去自动找这些自动验证方法。
//来实现验证,如果失败会create失败执行else区间
protected $_validate=array(
//下面还需要再写数组。一个数组就是一条验证规则
array('验证字段','验证规则','错误提示','验证条件','附加规则','验证时间')
)
==============================================
自动验证(主要完成对输入内容的检验(是否与数据库中表结构相同,输入内容是否符合我们所期望的值))
自动验证 示例
// array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])
protected $_validate = array(
// 手机验证:必填、格式需正确、唯一性
array('manager_phone','require','手机号码必须填写!'),
array('manager_phone','checkPhone','手机号码格式不正确',2,'callback',3),
array('manager_phone','','手机号码已存在!',0,'unique')
);
//回调函数-- 手机号码的验证
// @param $data 您表单中输入的手机号码信息
public function checkPhone($data){
return Tool::validatePhone($data);
}
Tool类(自定义,需自行导入)中的 validatePhone()方法定义如下:
/**
* @param String $strData 用户输入的手机号码信息
* @return Bool true(手机号码验证通过,符合手机号码格式)
*/
public static function validatePhone($strData)
{
$strRule="/^[1][358]\d{9}$/";
if(preg_match($strRule,$strData)==0)
{
return false;
}
return true;
}
==============================================
自动完成(主要完成参数的过滤和默认值的填充)
// 自动完成
// array(填充字段,填充内容,[填充条件,附加规则])
protected $_auto=array(
// 增加和修改时,将密码填充为123456,并使用MD5加密
array('manager_password','defaultPassword',3,'callback')
);
/**
* 作用:在添加和修改时,密码填充为123456的md5加密形式
* @return string
*/
public function defaultPassword(){
$strPassword=md5('123456');
return $strPassword;
}
==============================================
//字段映射
protected $_map=array(
// 不用写数组啦
//'是要在表单当中的字段写在前面'=>'是写到后面,数据表当中的真实字段写到后面',
'uname'=>'username',
'upass'=>'password',
);
ThinkPHP 自动验证与自动填充无效可能的原因
自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析。
create()
ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关。
create 方法语法如下:
create(mixed data, string type)
data 表示接受的数据,type 表示本次的具体操作(写入还是更新数据)。两个参数都可省略,data 参数省略的情况下默认为接受 $_POST 数据,而 type 默认情况下由系统自动识别。
但系统自动识别 type 是有缺陷的,当传入的字段有主键字段时,系统就识别为更新操作,否则就是写入操作。所以当主键字段非自动增长而是需要 SQL 写入时,那么自动验证和自动填充都可能无效。
例如添加数据记录时,如果表单中有主键字段或者系统中产生了主键字段(如录入设备编号),那么 ThinkPHP 就认为本次操作为更新操作,对于例如下面设定的自动验证和填充都会略过:
protected $_validate = array(
// 新增时验证标题唯一
array('ti
};
// 自动填充
protected $_auto = array(
// 新增时填充时间戳
array('pubtime','time',1,'function'),
);
尽管在操作中,执行了 add() 操作将数据写入了数据表,但这时会发现自动验证与自动填充无效。
出现这种情况时,只需将操作类型显式的传入 create() 方法即可,即 create($_POST,1),告诉系统本次操作为写入数据。另外如果传入的数据不是 $_POST ,也要将数据当作参数传入,如 create($_GET)。
字段未对应
由于粗心,未对应好表单字段与数据表字段。
数据表字段做了更改
在开发过程中,更改了表字段名称,而缓存未及时更新,导致系统判断为无效字段而被 unset 掉。所以在更改了表字段名称之后,及时将 Runtime/Data 下的数据表缓存清除。
Model 命名错误
Model 命名错误,未严格按照规范命名,如头字母未大写或粗心导致字母顺序不对,多或少字母等。这等错误往往会直接导致模型失效。
M 方法中使用自动验证与自动完成
一般情况下,使用 M 方法实例化模型时,是无法实例化自定义模型类的,也就无法使用自动验证与自动完成功能,因此建议使用 D 方法来实例化模型类。如果必须要在 M 方法中实现自动验证或自动完成,参看《ThinkPHP 使用M方法(不创建模型类)时实现自动验证与自动填充》。
最佳答案
