了然听雨
- 了然听雨 提出了问题如何循环连贯的方法【已解决】
- 了然听雨 2016-03-29 已签到连续签到1天,获得了5个金钱
自定义一个模型,然后在这个模型里设置rules,会自动生成表单验证。
例如:class ContactForm extends Model { public $name; public $email; public $subject; public $body; public $verifyCode; /** * @inheritdoc */ public function rules() { return [ // name, email, subject and body are required [['name', 'email', 'subject', 'body'], 'required'], // email has to be a valid email address ['email', 'email'], // verifyCode needs to be entered correctly ['verifyCode', 'captcha'], ]; }
@lilongsy 我没有对应的表,就是无模型的表单,想使用yii自带的验证用这种方式可以么,
- 了然听雨 2015-12-19 已签到连续签到1天,获得了5个金钱
- 了然听雨 2015-11-25 已签到连续签到2天,获得了10个金钱
- 了然听雨 2015-11-24 已签到连续签到1天,获得了5个金钱
如果需要
姓名和身份证 严格匹配
, 需要从公安系统验证, 一般公司是没这个资质的...幸好... 有资格的服务商 提供
api
, 调用一次 大概三块钱左右;如果不用严格匹配... 按身份证数字规则做验证即可. 大概规则 这里给你贴一下
前6位为行政区划分代码 ( 网上很多数据库数据, 你可以下载来作验证 )
第7位至14位为出生日期 (使用
php
函数验证是否是正确日期即可)第15位至17位为顺序码 ( 无法验证 )
第18位为校验码。 (具体验证规则 百度 "身份证最后一位")
你可以根据以上信息, 进行选择性进行验证
@500miles 应该是没有执行,我再去检查一下。
function isIdCardNo(num) { num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。 if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) { alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。'); return false; } //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 //下面分别分析出生日期和校验位 var len, re; len = num.length; if (len == 15) { re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert('输入的身份证号里出生日期不对!'); return false; } else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6); for(i = 0; i < 17; i ++) { nTemp += num.substr(i, 1) * arrInt[i]; } num += arrCh[nTemp % 11]; return num; } } if (len == 18) { re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/); var arrSplit = num.match(re); //检查生日日期是否正确 var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { alert(dtmBirth.getYear()); alert(arrSplit[2]); alert('输入的身份证号里出生日期不对!'); return false; } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。 var valnum; var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); var nTemp = 0, i; for(i = 0; i < 17; i ++) { nTemp += num.substr(i, 1) * arrInt[i]; } valnum = arrCh[nTemp % 11]; if (valnum != num.substr(17, 1)) { alert('18位身份证的校验码不正确!应该为:' + valnum); return false; } return num; } } return false; }
['id_number', function ($attribute, $params){ $cin = new CheckIdNum(); if($cin->checkIdentity($this->id_number)){ return true; }else{ $this->addError($attribute, '请输入正确的身份证号!'); } }],
我把验证的封装成了 一个class