【問題描述】
當(dāng)前使用的版本是DedeCMS V5.5的UTF8版本。庫(kù)中已經(jīng)注冊(cè)了若干用戶,從問答模塊點(diǎn)擊某用戶名時(shí)卻無(wú)法進(jìn)入其個(gè)人空間,顯示“你訪問的用戶可能已經(jīng)被刪除!”提示。依次檢查所有用戶,并非所有漢字名用戶不能用,個(gè)別可用的用戶名完全無(wú)規(guī)律可循,即便出現(xiàn)了錯(cuò)誤的漢字用戶名如果將其連接輸入在瀏覽器的地址欄中,卻能夠正常的打開。
在網(wǎng)絡(luò)上尋找錯(cuò)誤解決方法,發(fā)現(xiàn)Dede官網(wǎng)中提出此問題的人很多,而且從5.3開始就一直存在這個(gè)問題,有個(gè)別朋友提出的底層解決方案,修改空間模版中“..\member\space\company”文件夾下的index.htm, introduce.htm, listshop.htm, contact.htm, guestbook.htm 五個(gè)文件中<a href="/main/?uid=company&action=products&mtype={dede:value.mtypeid/}" target="_blank">{dede:value.mtypename/}</a>語(yǔ)句的company替換為{dede:var.userid_e /}變量的方法,經(jīng)過實(shí)驗(yàn)并沒有解決問題。
又看到網(wǎng)上教程中發(fā)布的文章提到的在保留uid訪問方式同時(shí)增加mid訪問的方法,經(jīng)過實(shí)驗(yàn)問題依然存在。教程中提到將“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']; } } } |
分析這兩段代碼,織夢(mèng)無(wú)憂小編提出的代碼中增加了從數(shù)據(jù)庫(kù)中重新讀出用戶ID的內(nèi)容重新給uid傳遞一個(gè)值,但是把源程序中用于判斷uid值是否UTF8編碼格式的內(nèi)容給丟了。這樣的修改大概可以解決同時(shí)出現(xiàn)了uid、mid兩個(gè)訪問參數(shù)撞車時(shí)的問題,但是依然解決不了UTF8編碼漢字用戶名的問題。
還有些網(wǎng)友干脆認(rèn)真提出方案限制用戶使用漢字名注冊(cè),方法相當(dāng)詳備。不過如果使用UTF8編碼就放棄漢字用戶名注冊(cè)未免有點(diǎn)說不過去了,這里就不再詳轉(zhuǎn)具體方法了。
【問題分析】 從故障的現(xiàn)象看,應(yīng)該是在判斷uid值是出現(xiàn)了錯(cuò)誤,導(dǎo)致系統(tǒng)無(wú)法識(shí)別用戶,仔細(xì)分析官方代碼中對(duì)于漢字UTF8編碼的uid判斷語(yǔ)句,是利用了GB2UTF8和UTF82GB兩個(gè)函數(shù)進(jìn)行兩次轉(zhuǎn)換然后判斷代碼。在網(wǎng)上找了關(guān)于UTF8和GB編碼的判斷問題,發(fā)現(xiàn)其實(shí)遠(yuǎn)遠(yuǎn)不是這么簡(jiǎn)單的事兒。在GB編碼和UTF8編碼中,存在著部分漢字編碼是相同或某部分字節(jié)相同的情況,這樣利用兩次轉(zhuǎn)換的方法判斷編碼是很不準(zhǔn)確的,于是出現(xiàn)了沒有重碼的漢字用戶名可以正確判斷并使用,而出現(xiàn)重碼的漢字名不能正確判斷,發(fā)生了“你訪問的用戶可能已經(jīng)被刪除!”錯(cuò)誤。
【解決方法】
在網(wǎng)絡(luò)上搜索了一些關(guān)于UTF8編碼判斷的代碼,找到了一個(gè)用PHP編寫的判斷函數(shù)。將此名為isUTF8($str)的函數(shù)添加在“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); 故障排除。
這里僅對(duì)官方代碼中判斷用戶UTF8編碼的方法進(jìn)行了修改,并沒有對(duì)織夢(mèng)無(wú)憂小編提出的mid參數(shù)問題進(jìn)行修改,若出現(xiàn)了織夢(mèng)無(wú)憂小編提出的故障現(xiàn)象相信他們提到的方法是不錯(cuò)的解決方案。此文已扼要列出了織夢(mèng)無(wú)憂小編的方法備考。
版權(quán)聲明: 本站資源均來(lái)自互聯(lián)網(wǎng)或會(huì)員發(fā)布,如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除!謝謝!
轉(zhuǎn)載請(qǐng)注明: DedeCMS提示你訪問的用戶可能已經(jīng)被刪除的問題