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

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

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

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

3r3w

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

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

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

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

上面我已經(jīng)說了,在執(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í)行刪除這條記錄的語句,然后反饋提示給用戶說不能發(fā)布這樣的內(nèi)容。

通過查看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;

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

//通過返回的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)來一起做判斷。這種其實(shí)是退一步的方式,因?yàn)橹辽俑冻隽硕嘤嗟膬蓷lsql操作,實(shí)際上如果我們確定了這些字符對(duì)應(yīng)的范圍,然后使用正則在執(zhí)行insert前就可以過濾掉。

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

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

解答本文疑問/技術(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ò)
分享:
都匀市| 新郑市| 尉氏县| 靖安县| 道真| 陕西省| 大渡口区| 云浮市| 乌兰浩特市| 靖远县| 苗栗县| 偃师市| 营山县| 富平县| 福建省| 民县| 达日县| 轮台县| 屯留县| 白山市| 抚宁县| 香格里拉县| 乳山市| 宁阳县| 连平县| 南汇区| 格尔木市| 霍山县| 外汇| 宁远县| 无锡市| 比如县| 永登县| 曲周县| 新安县| 铁岭县| 涡阳县| 绥化市| 抚顺县| 团风县| 喀喇沁旗|