Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2启用强制上传头像无效的分析

[复制链接]
vinsonwang 发表于 2011-5-9 12:27:55 | 显示全部楼层 |阅读模式
*************************************************
** 本教程基于版本:Discuz! X 2.0               **
*************************************************
强制上传头像往往会作为站长防灌水和引导用户完善资料的手段,之前有部分站长提出自己的网站设置强制上传头像无效,上传头像后,依然提示需要上传。现在对这部分功能做一下分析,看看问题出在哪。
在后台,全局防灌水基本设置中,可以开启“强制新用户上传头像”,开启后,setting表中need_avatar字段的值变为“1”。这时新注册的用户如果需要进行发帖回复等操作,没进行头像上传的,应该会提示上传头像。例如进行发帖操作,会调用forum_post.php文件中的cknewuser();函数对用户进行验证,cknewuser();function_core.php中定义,其中大约3160行有对头像的验证,我们看看验证的条件:
  1. if($_G['setting']['need_avatar'] && empty($ckuser['avatarstatus'])) {
  2.                    if(empty($return)) showmessage('no_privilege_avatar', '', array(), array('return' => true));
  3.                    $result = false;
  4.          }
复制代码

首先看看setting表中是否有need_avatar值,即是否需要验证强制上传头像,并且验证用户member表中的avatarstatus字段是否有值,即这个用户是否上传过头像,上传过值为1,否,则值为0,从这里看,如过设置过需要进行强制上传头像,那么,setting表中need_avatar字段值应该是有的,如果还提示需要上传,则说明member表中的头像状态值为0,下面我们看看这个状态值怎么来的。
我们从上传头像开始,上传头像需要的文件为spacecp_avatar.php
  1. if(empty($space['avatarstatus']) && uc_check_avatar($_G['uid'], 'middle')) {
  2.          DB::update('common_member', array('avatarstatus'=>'1'), array('uid'=>$_G['uid']));
  3.          updatecreditbyaction('setavatar');
  4.          manyoulog('user', $_G['uid'], 'update');
  5. }
复制代码

我们只对部分代码进行分析,这段代码的作用是,上传了头像后,判断这个用户是否上传过头像,即有没有avatarstatus值,并且用uc_check_avatar检查用户头像是否存在,这个uc_check_avatar函数用到了uc_fopen2函数,uc_fopen2函数用到几个参数,其中就有UCenter的配置文件中的Iphost,如果用户对其hosts文件进行过修改,或留空且域名解析有问题,都会造成uc_fopen2函数返回值不为1,不为1的情况下,造成上一段代码条件不成立,进而没有对common_member表的avatarstatus值进行update更新操作,那么也就造成一直提示用户需要上传头像。
解决方法:一个是可以填写服务器真实IP,或者参照网上其它方法,例如
找到
  1. function uc_check_avatar($uid, $size = ‘middle’, $type = ‘virtual’) {
  2. $url = UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″;
  3. $res = uc_fopen2($url, 500000, ”, ”, TRUE, UC_IP, 20);
  4. if($res == 1) {
  5. return 1;
  6. } else {
  7. return 0;
  8. }
  9. }
  10. 改成:
  11. function uc_check_avatar($uid, $size = ‘middle’, $type = ‘virtual’) {
  12.         $url = UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″;
  13.         @$file_exists = trim(uc_fopen2(UC_API.”/avatar.php?uid=$uid&check_file_exists=1″));
  14.     return $file_exists;
  15. }
复制代码

直接进行头像文件存在与否的判断。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-22 11:27 , Processed in 0.022948 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表