2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

長(zhǎng)沙論壇開發(fā):Discuz發(fā)布特殊字符帖子內(nèi)容為空的臨時(shí)解決方案

2016-05-06 20:55 欄目:技術(shù)開發(fā) 查看(13368)

最近發(fā)現(xiàn)了一個(gè)非常有意思的問(wèn)題,那就是我們可以在幾乎所有的基于Discuz的論壇中發(fā)布標(biāo)題和帖子都為空的內(nèi)容,這種情況在正常的運(yùn)營(yíng)過(guò)程中是不可能出現(xiàn)的,而且出現(xiàn)之后肯定是非常影響用戶體驗(yàn)的。比如一整版都被刷成了空白,想想都要?dú)庹?。說(shuō)到這個(gè)問(wèn)題,我們先來(lái)看一張圖:

3r3w

這張圖很多人應(yīng)該都看到過(guò),沒(méi)錯(cuò),這就是從我的手機(jī)上截圖下來(lái)的,在我印象中好像ios自帶輸入法都會(huì)有這種稱之為emoji的表情,而且現(xiàn)在非常流行。這種表情其實(shí)也算是一種特殊符號(hào),大家可以在基于Discuz的論壇中發(fā)布這樣的內(nèi)容,我們會(huì)發(fā)現(xiàn)內(nèi)容是空白的(discuz默認(rèn)是不允許發(fā)布空的內(nèi)容的);通過(guò)我們的測(cè)試很多開源的程序發(fā)布諸如這類特殊符號(hào)的時(shí)候,最終顯示出來(lái)的是空白;再比如輸入“€”符號(hào)(歐元符號(hào))也會(huì)是這樣。

大家都知道在discuz發(fā)布帖子的時(shí)候?qū)?yīng)執(zhí)行的腳本在source/module/forum/forum_post.php中,通過(guò)分析,我們可以追蹤到我們輸入的特殊字符在執(zhí)行insert語(yǔ)句的時(shí)候依然不是空的,而插入到數(shù)據(jù)庫(kù)中后就是空的了,當(dāng)然顯示出來(lái)也是空的了。

實(shí)際上就是因?yàn)檫@些特殊字符的某些原因,造成這種字符的存儲(chǔ)問(wèn)題。實(shí)際上我們也會(huì)看到很多知名站點(diǎn)是支持emoji的,當(dāng)然他們是做了處理的,實(shí)際上針對(duì)這點(diǎn),在github上有很多開源的項(xiàng)目,如果愿意折騰可以讓我們的項(xiàng)目也支持。當(dāng)然除了emoji外,其實(shí)還有其他的一些特殊字符要處理。

于是有些人就會(huì)說(shuō),這么麻煩,還是不需要支持吧,我直接把這樣的帖子給刪除了。但手動(dòng)刪除顯然不太好了,于是就有了這個(gè)臨時(shí)的解決方案,其實(shí)對(duì)于我來(lái)說(shuō)并不算解決方案,因?yàn)檫@并沒(méi)有從根本上解決問(wèn)題。它唯一做的事情就是自動(dòng)刪帖,但有人提出這樣的需求還是照干吧。

上面我已經(jīng)說(shuō)了,在執(zhí)行insert的時(shí)候所對(duì)應(yīng)的參數(shù)值還是不為空的,那么就是在存入數(shù)據(jù)庫(kù)的時(shí)候變成了空的。于是就可以這樣子,在執(zhí)行內(nèi)容insert腳本后面緊跟著做一個(gè)判斷,再次查詢剛剛插入的數(shù)據(jù),然后判斷對(duì)應(yīng)的內(nèi)容是否為空,如果為空?qǐng)?zhí)行刪除這條記錄的語(yǔ)句,然后反饋提示給用戶說(shuō)不能發(fā)布這樣的內(nèi)容。

通過(guò)查看discuz的源代碼,我們可以在source/include/post/post_newreply.php中找到回帖開始執(zhí)行insert的代碼,就是在其中的newreply()方法,而相應(yīng)的發(fā)布帖子對(duì)應(yīng)的就是同目錄下的post_newthread.php。以回帖為例,我們可以在newreply()執(zhí)行的后面,也就是找到如下代碼:

$modpost->attach_before_methods('newreply', $bfmethods);
$modpost->attach_after_methods('newreply', $afmethods);
$return = $modpost->newreply($params);
$pid = $modpost->pid;

在這段代碼后面加入以下代碼

//通過(guò)返回的pid獲取插入的信息
$databypid=C::t('forum_post')->fetch_by_pid_condition($tableid, $pid,'','message');
//判斷message是否為''
if(empty($databypid['message'])){
    DB::delete('forum_post', array('pid' => $pid));//刪除message為''時(shí)的整個(gè)記錄
    showmessage('不能輸入特殊字符或表情!');//給用戶提示
}

流程就是跟上面提到的一樣,當(dāng)然在發(fā)帖的中間,我們應(yīng)該在判斷中加入對(duì)標(biāo)題的判斷,也就是除了message這個(gè)字段外,還應(yīng)該加入subject字段加進(jìn)來(lái)一起做判斷。這種其實(shí)是退一步的方式,因?yàn)橹辽俑冻隽硕嘤嗟膬蓷lsql操作,實(shí)際上如果我們確定了這些字符對(duì)應(yīng)的范圍,然后使用正則在執(zhí)行insert前就可以過(guò)濾掉。

與我們的項(xiàng)目經(jīng)理聯(lián)系
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請(qǐng)注明出處:長(zhǎng)沙論壇開發(fā):Discuz發(fā)布特殊字符帖子內(nèi)容為空的臨時(shí)解決方案 - 微構(gòu)網(wǎng)絡(luò)
分享:
尼勒克县| 北海市| 正安县| 奉化市| 长泰县| 阳山县| 蓝山县| 阿图什市| 咸宁市| 道孚县| 东乡| 瓦房店市| 桐梓县| 巨鹿县| 永安市| 聊城市| 凤城市| 米林县| 仙游县| 贵州省| 射洪县| 宜都市| 金塔县| 兴山县| 藁城市| 陆良县| 华容县| 东乡县| 弥勒县| 东乡族自治县| 青冈县| 青川县| 叙永县| 台中县| 新野县| 浦江县| 乐平市| 玛沁县| 娱乐| 同江市| 渝中区|