自动验证

来源:互联网 发布:淘宝苏宁易购 编辑:程序博客网 时间:2024/06/02 20:00

ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关。create 方法语法如下:create(mixed data, string type)
data 表示接受的数据,type 表示本次的具体操作(写入还是更新数据)。两个参数都可省略,data 参数省略的情况下默认为接受 $_POST 数据,而 type 默认情况下由系统自动识别。

但系统自动识别 type 是有缺陷的,当传入的字段有主键字段时,系统就识别为更新操作,否则就是写入操作。所以当主键字段非自动增长而是需要 SQL 写入时,那么自动验证和自动填充都可能无效。

例如添加数据记录时,如果表单中有主键字段或者系统中产生了主键字段(如录入设备编号),那么 ThinkPHP 就认为本次操作为更新操作,对于例如下面设定的自动验证和填充都会略过:

protected $_validate = array(

// 新增时验证标题唯一

array(‘title’,”,’标题已经存在!’,0,’unique’,1),

 );

// 自动填充

protected $_auto = array(

// 新增时填充时间戳

 array(‘pubtime’,’time’,1,’function’),

 );

 

尽管在操作中,执行了 add() 操作将数据写入了数据表,但这时会发现自动验证与自动填充无效。

出现这种情况时,只需将操作类型显式的传入 create() 方法即可,即 create($_POST,1),告诉系统本次操作为写入数据。另外如果传入的数据不是 $_POST ,也要将数据当作参数传入,如 create($_GET)。

字段未对应
由于粗心,未对应好表单字段与数据表字段。

数据表字段做了更改
在开发过程中,更改了表字段名称,而缓存未及时更新,导致系统判断为无效字段而被 unset 掉。所以在更改了表字段名称之后,及时将 Runtime/Data 下的数据表缓存清除。

Model 命名错误
Model 命名错误,未严格按照规范命名,如头字母未大写或粗心导致字母顺序不对,多或少字母等。这等错误往往会直接导致模型失效。

M 方法中使用自动验证与自动完成

一般情况下,使用 M 方法实例化模型时,是无法实例化自定义模型类的,也就无法使用自动验证与自动完成功能,因此建议使用 D 方法来实例化模型类。


 thinkphp框架里面自带有很多自动验证的规则,下面是框架自带的正则验证的规则,官方的说明文档里面没有这么多,所以记下来,以备使用。

view sourceprint?
01
static $regex = array(
02
        'require'=> '/.+/', //匹配任意字符,除了空和断行符
03
        'email' =>'/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
04
        'phone' =>'/^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/',
05
        'mobile' =>'/^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/',
06
        'url' =>'/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/',
07
        'currency' => '/^\d+(\.\d+)?$/',
08
        'number' => '/\d+$/',
09
        'zip' => '/^[1-9]\d{5}$/',
10
        'qq' => '/^[1-9]\d{4,12}$/',
11
        'integer' => '/^[-\+]?\d+$/',
12
        'double' => '/^[-\+]?\d+(\.\d+)?$/',
13
        'english' => '/^[A-Za-z]+$/',
14
);
自动验证的使用方法,具体可以参见官方手册

01
   var $_validate=array(
02
   array('name','require','姓名必须填写!'),
03
   array('banji','require','班级必须填写!'),
04
   array('jiguan','require','籍贯必须填写!'),
05
   array('rtsj','/^\d{4}\-\d{1,2}-\d{1,2}$/','入团时间格式错误!'),
06
   array('rtdd','require','入团地点必须填写!'),
07
   array('birthday','/^\d{4}\-\d{1,2}-\d{1,2}$/','出生年月格式错误!'),
08
   array('qianfarq','/^\d{4}\-\d{1,2}-\d{1,2}$/','签发日期格式错误!'),
09
   array('bianhao','require','团员编号必须填写!'),
10
);

 

array(‘name’,’/^[a-z]\w{3,}$/i’,’名字不符合要求!’);


array(‘password’,’/^[a-z]\w{6,30}$/i’,’密码不符合要求!’);


array(‘account’,’/^[A-Za-z]+$/’,’账号必须使用英文!’);


附上一些表单验证中比较常用的正则表达式写法:


匹配中文字符的正则表达式: [\u4e00-\u9fa5]


匹配双字节字符(包括汉字在内):[^\x00-\xff]


匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*


匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*


匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$


匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}


匹配中国邮政编码:[1-9]\d{5}(?!\d)


匹配ip地址:\d+\.\d+\.\d+\.\d+


匹配特定数字:


^[1-9]\d*$    //匹配正整数


^-[1-9]\d*$   //匹配负整数


^-?[1-9]\d*$   //匹配整数



^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)


^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)


^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数


^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数


^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数


^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)


^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 +0)


匹配特定字符串:


^[A-Za-z]+$  //匹配由26个英文字母组成的字符串


^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串


^[a-z]+$  //匹配由26个英文字母的小写组成的字符串


^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串


^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

 

匹配中文字符的正则表达式: [\u4e00-\u9fa5]


评注:匹配中文还真是个头疼的事,有了这个表达式就好办了


匹配双字节字符(包括汉字在内):[^\x00-\xff]


评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)


匹配空白行的正则表达式:\n\s*\r


评注:可以用来删除空白行


匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*?/>


评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力


匹配首尾空白字符的正则表达式:^\s*|\s*$


评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式


匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*


评注:表单验证时很实用


匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*


评注:网上流传的版本功能很有限,上面这个基本可以满足需求


匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$


评注:表单验证时很实用


匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}


评注:匹配形式如 0511-4405222 或 021-87888822


匹配腾讯QQ号:[1-9][0-9]{4,}


评注:腾讯QQ号从10000开始


匹配中国邮政编码:[1-9]\d{5}(?!\d)


评注:中国邮政编码为6位数字


匹配身份证:\d{15}|\d{18}


评注:中国的身份证为15位或18位


匹配ip地址:\d+\.\d+\.\d+\.\d+


评注:提取ip地址时有用 


0 0
原创粉丝点击