1、公司的项目起始比较早,一直用的是ThinkPHP3.1.2,即使搭建新项目也还是用它。今天发现在TP的视图层使用if标签时有个注意点:输出内容中的空格会被trim掉
<input type="radio"<if condition="$c1"> disabled</if><if condition="$c2"> checked</if> value="" />
像以上这样,虽然在disabled和checked前面加了空格,但是实际输出时可能是这样的:
<input type="radio"disabledchecked value="" />
是的,我特意为他们之间保留的空格消失了,很必然这两个属性就不存在了,不是我要的效果。所以,遇到这种情况时应该这样操作:
<input type="radio" <if condition="$c1">disabled</if> <if condition="$c2">checked</if> value="" />
即把空格直接挪到if标签前面去。
2、一测试岗位同事的身份证号尾数刚好是0,于是他在测试我的程序功能时,将他的身份证尾号改为X,发现竟然通过了我的身份证检验函数,但改为1-9的其他数字时都能正常报错,于是我立即反应过来,应该是我的身份证检验函数不完善。这是我的PHP同事在网上拿下来用了很久的函数了,打开函数一看,觉得末尾的if ($res != $a[17])似乎并没有什么问题
/**
* 根据身份证号码获得性别年龄
* @param $IDCard
* @return mixed
*/
function getIDCardInfo($IDCard)
{
$result['error'] = '';
$result['sex'] = '';
$result['date'] = '';
$result['age'] = '';
//去除空格
$IDCard = str_replace(' ', '', $IDCard);
if (!preg_match("/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/", $IDCard)) {
$result['error'] = '身份证号码格式不正确';
return $result;
} else {
//如果是15位 第15位单数是男,双数为女
if (strlen($IDCard) == 15) {
//实例130503 670401 001
$tyear = intval(substr($IDCard, 6, 2));
$tyear = "19" . $tyear;
$tmonth = intval(substr($IDCard, 8, 2));
$tday = intval(substr($IDCard, 10, 2));
$sex = intval(substr($IDCard, 14, 1));
if ($sex % 2 == 1) {
$result['sex'] = '1';
} else {
$result['sex'] = '2';
}
$result['date'] = $tyear . "-" . $tmonth . "-" . $tday;
//根据年月算出当前年龄
$now = strtotime("now");
list($year, $month, $day) = explode("-", date("Y-m-d", $now));
$age = $year - $tyear;
if ((int)($month . $day) < (int)($tmonth . $tday)) {
$age -= 1;
}
$result['age'] = $age;
// 对年龄进行判断
if ($age > 120 || $age < 18) {
$result['error'] = "年龄异常,身份证号码输入有误";
}
} elseif (strlen($IDCard) == 18) {
//如果是18位 判断第17位 ,男性为单数,女性为双数 511381 19890804 1213
$tyear = intval("" . substr($IDCard, 6, 4));
$tmonth = intval(substr($IDCard, 10, 2));
$tday = intval(substr($IDCard, 12, 2));
$sex = intval(substr($IDCard, 16, 1));
if ($sex % 2 == 1) {
$result['sex'] = '1';
} else {
$result['sex'] = '2';
}
$result['date'] = $tyear . "-" . $tmonth . "-" . $tday;
$now = strtotime("now");
list($year, $month, $day) = explode("-", date("Y-m-d", $now));
$age = $year - $tyear;
if ((int)($month . $day) < (int)($tmonth . $tday)) {
$age -= 1;
}
$result['age'] = $age;
//对年龄进行判断
if ($age > 120 || $age < 18) {
$result['error'] = "年龄异常,身份证号码输入有误";
}
//验证最后一位的验证码
$a = str_split($IDCard, 1);
$w = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
$c = array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2);
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum = $sum + $a[$i] * $w[$i];
}
$r = $sum % 11;
$res = $c[$r]; //校验码
if ($res != $a[17]) {
$result['error']="身份证号码最后一位校验码异常,输入有误";
}
}
}
return $result;
}
但是又有所怀疑,于是改成if ((''.$res) != $a[17])把$res变量改成字符形式,终于能够报错了。
这个问题是因为条件两端数据类型不一致产生的,正是因为我留意过很多种变量类型不一致的判断而发生的异常,所以才会去做这种尝试,没想到真的就一次成功了。
可是问题又来了,$a数组的所有元素都应该是字符类型,为什么0-9的数字形式字符都能正常判断,偏偏字符X不能正常判断呢?仔细看一下代码,$res取自$c数组,而$c数组里面的0是数字形式,须知PHP是弱类型语言,当数字与字符作比较时会将字符转为数字后再按数字类型进行比较,因此还有一个解法是给$c里面的0也像X一样套上引号,like this:
$c = array(1, '0', 'X', 9, 8, 7, 6, 5, 4, 3, 2);
而其他数字套不套引号并不重要,并不影响最终的计算验证。
如果是我来写这个函数,我的方式可能是
$c = str_split('10X98765432', 1);
这样就不会存在上面的问题了。