一个引用的坑

<?php
$arr1 = array(0 => array("a" =>1,"b" =>2),1 => array("a" =>3,"b" =>4));
foreach($arr1 as &$row){

}

$arr2 = array(0 => array("a" =>5,"b" =>6));
foreach($arr2 as $row){

}

print_r($arr1);

上面代码输出什么?

这里的问题就是第一个foreach里的row是引用,而for、foreach里面用的循环变量,都是习惯用固定命名的变量,两者加起来产生了这个bug

引用的变量,切记不要和其他变量命名重复。

mysql整形转换的坑

select * from table where id = '$id'

 

id如果输入12abc会怎样?,会把id=12的记录匹配出来,这是因为mysql会自动把12abc转换成整数12,当然前提是id是数值类型。

在有些时候这会误匹配,比如,用户登录,既可以输入用户名,又可以输入手机号码,还可以输入id,还可以输入邮箱,等等,sql恐怕会是这样的:

select * from users where name = '$name' or phone ='$name' or id = '$name' or ....

如果输入的字符串能被转换成非0整数,那就会造成误匹配。这种逻辑应该怎么处理呢,理清一下,首先要避免容易混淆的输入选项,比如id和手机号码,谁能确保13888888888是一个id还是一个手机号码,业务逻辑本身就存在误匹配的隐患。接下来要看的就是用户名这个字段,如果非要使用这个字段登陆,一定要确保用户名不能像email,不能纯数字,这样才能和email以及id区分开来。

根据用户输入,进行判断,如果是email格式,只匹配email,如果是纯数字,只匹配id,其他情况匹配用户名。