DedeCMS提示你访问的用户可能已经被删除的问题
【问题描述】
当前使用的版本是DedeCMS V5.5的UTF8版本。库中已经注册了若干用户,从问答模块点击某用户名时却无法进入其个人空间,显示“你访问的用户可能已经被删除!”提示。依次检查所有用户,并非所有汉字名用户不能用,个别可用的用户名完全无规律可循,即便出现了错误的汉字用户名如果将其连接输入在浏览器的地址栏中,却能够正常的打开。
在网络上寻找错误解决方法,发现Dede官网中提出此问题的人很多,而且从5.3开始就一直存在这个问题,有个别朋友提出的底层解决方案,修改空间模版中“..\member\space\company”文件夹下的index.htm, introduce.htm, listshop.htm, contact.htm, guestbook.htm 五个文件中<a href="/main/?uid=company&action=products&mtype={dede:value.mtypeid/}" target="_blank">{dede:value.mtypename/}</a>语句的company替换为{dede:var.userid_e /}变量的方法,经过实验并没有解决问题。
又看到网上教程中发布的文章提到的在保留uid访问方式同时增加mid访问的方法,经过实验问题依然存在。教程中提到将“member/index.php”文件中的
if(empty($uid)) { $uid = ''; } else { $tmpstr = @gb2utf8($uid); $tmpstr2 = @utf82gb($tmpstr); if($tmpstr2==$uid) $uid = $tmpstr; } |
代码更改为
if(empty($uid)) { if (empty($_REQUEST['mid'])) { $uid = ''; }else{ $uid=$dsql->GetOne("Select userid From `dede_member` where mid='".$_REQUEST['mid']."'; "); if (!is_array($uid)){ $uid=''; }else{ $uid=$uid['userid']; } } } |
分析这两段代码,织梦58小编提出的代码中增加了从数据库中重新读出用户ID的内容重新给uid传递一个值,但是把源程序中用于判断uid值是否UTF8编码格式的内容给丢了。这样的修改大概可以解决同时出现了uid、mid两个访问参数撞车时的问题,但是依然解决不了UTF8编码汉字用户名的问题。
还有些网友干脆认真提出方案限制用户使用汉字名注册,方法相当详备。不过如果使用UTF8编码就放弃汉字用户名注册未免有点说不过去了,这里就不再详转具体方法了。
【问题分析】 从故障的现象看,应该是在判断uid值是出现了错误,导致系统无法识别用户,仔细分析官方代码中对于汉字UTF8编码的uid判断语句,是利用了GB2UTF8和UTF82GB两个函数进行两次转换然后判断代码。在网上找了关于UTF8和GB编码的判断问题,发现其实远远不是这么简单的事儿。在GB编码和UTF8编码中,存在着部分汉字编码是相同或某部分字节相同的情况,这样利用两次转换的方法判断编码是很不准确的,于是出现了没有重码的汉字用户名可以正确判断并使用,而出现重码的汉字名不能正确判断,发生了“你访问的用户可能已经被删除!”错误。
【解决方法】
在网络上搜索了一些关于UTF8编码判断的代码,找到了一个用PHP编写的判断函数。将此名为isUTF8($str)的函数添加在“member\config.php”文件的最后:
[php] function isUTF8($str){ $length=strlen($str); for($i=0;$i<$length;$i++){ $high=ord($str{$i}); if(($high==0xC0)||($high==0xC1)){ return false; }elseif($high<0x80){ continue; }elseif($high<0xC0){ return false; }elseif($high<0xE0){ if(++$i>=$length) return true; elseif(($str{$i}&"\xC0")=="\x80") continue; }elseif($high<0xF0){ if(++$i>=$length){ return true; }elseif(($str{$i}&"\xC0")=="\x80"){ if(++$i>=$length) return true; elseif(($str{$i}&"\xC0")=="\x80") continue; } }elseif($high<0xF5){ if(++$i>=$length){ return true; }elseif(($str{$i}&"\xC0")=="\x80"){ if(++$i>=$length){ return true; }elseif(($str{$i}&"\xC0")=="\x80"){ if(++$i>=$length) return true; elseif(($str{$i}&"\xC0")=="\x80") continue; } } } return false; } return true; } [/php] |
并修改“member\index.php”中的代码:将 $tmpstr = @gb2utf8($uid); $tmpstr2 = @utf82gb($tmpstr); if($tmpstr2==$uid) $uid = $tmpstr; 修改为 if(!isUTF8($uid)) $uid = @gb2utf8($uid); 故障排除。
这里仅对官方代码中判断用户UTF8编码的方法进行了修改,并没有对织梦58小编提出的mid参数问题进行修改,若出现了织梦58小编提出的故障现象相信他们提到的方法是不错的解决方案。此文已扼要列出了织梦58小编的方法备考。
☉本站的源码不会像其它下载站一样植入大量的广告。为了更好的用户体验以后坚持不打水印
☉本站只提供精品源码,源码在于可用,不在多!!希望在这里找到你合适的。
☉本站提供的整站程序,均带数据及演示地址。可以在任一源码详情页查看演示地址
☉本站所有资源(包括源码、模板、素材、特效等)仅供学习与参考,请勿用于商业用途。
☉如有其他问题,请加网站客服QQ(984818011)进行交流。
- dedecms搬家时出现数据库导入失败的解决方法
- DEDECMS内容页分页过多、过长问题最佳解决方案
- dedecms调用当前栏目的子栏目的两种方法分享
- dedecms自定义表单用js代替联动类型解决联动问题
- 织梦dede修改关键字长度的方法
- 织梦dede后台卡、假死解决方法
- Dedecms自定义表单“数据校验不对,程序返回错误”的
- DEDECMS5.6和5.7跳转网址直接显示跳转网址的解决办法
- 织梦cms登录后台提示Function ereg_replace()错误的解
- media_add.php dedecms后台文件任意上传漏洞的解决方
- 关于软件频道不能像文章频道自动从tag中获取关键词的
- dedecms在后台更新时出现报错“读取频道信息失败,无法
常用故障问题
- 织梦教程:dedecms首页导航菜单调用一二级栏目的方法
- DedeCMS提示“Fatal error: Call to a member”错误的
- 织梦DEDECMS友情链接出现内页与首页都在首页显示解决
- dedecms后台登录成功后,又返回登录界面已成功解决!
- dedecms导航使用channelartlist在列表页面取不到二级
- dedecms tags伪静态完美解决办法
- 造成织梦dede搜索太慢的解决办法
- Dedecms v5.6会员中心自定义字段错位的问题
- 织梦模板dedeCMS调用四级栏目的方法
- DEDE启用多站点绝对网址导致RSS出错解决办法
- DedeCms文件加载顺序原理介绍
- dedecms织梦后台添加图片style全部都变成stxyle的解决