记录一下今天遇到的两只bug

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);
这样就不会存在上面的问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值