修复方法:
首先我先给出无效情况的演示代码,如下:$userid = intval($_GET['userid']);
$userinfo = $this->db->get_one('userid='.$userid);
$this->db->set_model(10); //原因便在这里
$userdetail = $this->db->get_one("userid=".$userid);
$avatar = get_memberavatar($userid,1,180); //结果$avatar为空内容
我们再来看下get_memberavatar()的部分源码:function get_memberavatar($uid, $is_userid='', $size='30') {
if($is_userid) {
$db = pc_base::load_model('member_model');
$memberinfo = $db->get_one(array('userid'=>$uid)); //获取会员的基本信息
if(isset($memberinfo['phpssouid'])) {
$uid = $memberinfo['phpssouid'];
} else {
return false;
}
}
...
综合以上两段代码,不知道你有没有发现错误原因在哪里呢?
当我们把后者代码放到前者代码的环境中时,并且第二个参数为真时,因为第一段代码中使用了set_model()方法对会员模型了设定从而使$this->db中的一个属性变量tablename(代表当前指向的数据表,默认为“member”)进行了更换,变成了“member_detail”之类的其它标,不再是‘member’这个值了,那么在后续的get_memberavatar()方法中再去读取会员信息时因为没有重置回member表,那么读取的仍然是‘member_detail'表,如此,后续数据中当然没有“$memberinfo['phpssouid']”这一项,结果返回false空内容。
解决方法:
解决方法当然也非常简单,就是在get_memberavatar()方法中为了防止外部环境中对数据表做了更改的影响,在方法里先重置操作回member表,再执行后面的操作。修改代码部分如下:if($is_userid) {
$db = pc_base::load_model('member_model');
$db->set_model(); //重置回member表
$memberinfo = $db->get_one(array('userid'=>$uid)); //获取会员的基本信息
...