昨天调试一段程序时,发现总是无法得到预期结果,代码如下:

  /**
   * 根据是否已经经过审核检查所有已经加入该活动的用户
   * 如果要取得所有已经审核过的用户,则传递第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,不同的是用单引号括上(用===全等自然也行),当然别忘了,在查询前,要将变量转为整形哦:)

总结:又遇上次满怪,经验啊grin

请给这篇日志评个分吧!

64 分数: 0.0/10 (0 votes 票)

工作 » LAMP | 评论(0) | 引用(0) | 阅读(712)
发表评论
 网址
 电邮
  密码 游客无需密码
 昵称  *  [注册]
               

 
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我