强制上传头像往往会作为站长防灌水和引导用户完善资料的手段,之前有部分站长提出自己的网站设置强制上传头像无效,上传头像后,依然提示需要上传。现在对这部分功能做一下分析,看看问题出在哪。
在后台,全局防灌水基本设置中,可以开启“强制新用户上传头像”,开启后,setting表中need_avatar字段的值变为“1”。这时新注册的用户如果需要进行发帖回复等操作,没进行头像上传的,应该会提示上传头像。例如进行发帖操作,会调用forum_post.php文件中的cknewuser();函数对用户进行验证,cknewuser();在function_core.php中定义,其中大约3160行有对头像的验证,我们看看验证的条件:
if($_G['setting']['need_avatar'] && empty($ckuser['avatarstatus'])) { if(empty($return)) showmessage('no_privilege_avatar', '', array(), array('return' => true)); $result = false; }
首先看看setting表中是否有need_avatar值,即是否需要验证强制上传头像,并且验证用户member表中的avatarstatus字段是否有值,即这个用户是否上传过头像,上传过值为1,否,则值为0,从这里看,如过设置过需要进行强制上传头像,那么,setting表中need_avatar字段值应该是有的,如果还提示需要上传,则说明member表中的头像状态值为0,下面我们看看这个状态值怎么来的。
我们从上传头像开始,上传头像需要的文件为spacecp_avatar.php,
if(empty($space['avatarstatus']) && uc_check_avatar($_G['uid'], 'middle')) { DB::update('common_member', array('avatarstatus'=>'1'), array('uid'=>$_G['uid'])); updatecreditbyaction('setavatar'); manyoulog('user', $_G['uid'], 'update'); }
我们只对部分代码进行分析,这段代码的作用是,上传了头像后,判断这个用户是否上传过头像,即有没有avatarstatus值,并且用uc_check_avatar检查用户头像是否存在,这个uc_check_avatar函数用到了uc_fopen2函数,uc_fopen2函数用到几个参数,其中就有UCenter的配置文件中的Ip,host,如果用户对其hosts文件进行过修改,或留空且域名解析有问题,都会造成uc_fopen2函数返回值不为1,不为1的情况下,造成上一段代码条件不成立,进而没有对common_member表的avatarstatus值进行update更新操作,那么也就造成一直提示用户需要上传头像。
解决方法:一个是可以填写服务器真实IP,或者参照网上其它方法,例如
找到
function uc_check_avatar($uid, $size = ‘middle’, $type = ‘virtual’) { $url = UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″; $res = uc_fopen2($url, 500000, ”, ”, TRUE, UC_IP, 20); if($res == 1) { return 1; } else { return 0; } }
改成:
function uc_check_avatar($uid, $size = ‘middle’, $type = ‘virtual’) { $url = UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″; @$file_exists = trim(uc_fopen2(UC_API.”/avatar.php?uid=$uid&check_file_exists=1″)); return $file_exists; }
直接进行头像文件存在与否的判断。