昨天调试一段程序时,发现总是无法得到预期结果,代码如下:
/**
* 根据是否已经经过审核检查所有已经加入该活动的用户
* 如果要取得所有已经审核过的用户,则传递第2个参数为1,
* 要取得所有,则不需传递第2个参数
*
* @param int $cid
* @param bool $status
* @return mfDatabaseResultSet
*/
static public function getJoinedUserByStatus($cid,$status)
{
$cid = intval($cid);
if($status == 'all')
{
if($status == 'a') echo 1;echo $status;
$sql = 'SELECT * FROM `user` WHERE `uid` IN (SELECT uid FROM `campaign_user` WHERE `cpid` = :cid ) ' ;
return self::queryForObjects($sql,array(':cid' =>$cid),'model_user');
}
else
{
$status = intval($status);
$sql = 'SELECT * FROM `user` WHERE `uid` IN (SELECT uid FROM `campaign_user` WHERE `cpid` = :cid AND `status` = :status) ' ;
return self::queryForObjects($sql,array(':cid' =>$cid,':status'=>$status),'model_user');
}
}
问题:当想传递参数0,查询状态为0的数据时,总是会语句走到了case:'all'流程
分析:没道理啊,难道0没有传递进参数?
尝试1:给第二个参数加上默认值0,想调用0状况时不传递第二个参数,问题依旧
分析:难道0 == all?bug?
尝试2:var_dump(0 == "all"); 输出 true
var_dump(0 == "a"); 输出 true
bug??赶紧查手册,找到这样一句话:
如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch 语句。
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // never reached because "a" is already matched with 0
echo "a";
break;
}
?>
恍然大悟,字符串在转成整数时居然都是变成0,以前一直以为是1,或者是ASC码:(
解决问题:将参数加上默认值0,不同的是用单引号括上(用===全等自然也行),当然别忘了,在查询前,要将变量转为整形哦:)
总结:又遇上次满怪,经验啊
请给这篇日志评个分吧!
发表评论


介绍几个替换冗余if/e
网站敏感关键字过滤的几种
