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