国产又猛又爽又黄视频|在线观看人成视频免费|少妇高潮太爽了在线视频|911国产免费无码专区|特黄做受又大又粗又长大片|欧美一级二级免费在线观看|日日夜人人澡人人澡人人看免|欧洲午夜精品一级毛片在线播放

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

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

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

3r3w

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

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

實際上就是因為這些特殊字符的某些原因,造成這種字符的存儲問題。實際上我們也會看到很多知名站點是支持emoji的,當然他們是做了處理的,實際上針對這點,在github上有很多開源的項目,如果愿意折騰可以讓我們的項目也支持。當然除了emoji外,其實還有其他的一些特殊字符要處理。

于是有些人就會說,這么麻煩,還是不需要支持吧,我直接把這樣的帖子給刪除了。但手動刪除顯然不太好了,于是就有了這個臨時的解決方案,其實對于我來說并不算解決方案,因為這并沒有從根本上解決問題。它唯一做的事情就是自動刪帖,但有人提出這樣的需求還是照干吧。

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

通過查看discuz的源代碼,我們可以在source/include/post/post_newreply.php中找到回帖開始執(zhí)行insert的代碼,就是在其中的newreply()方法,而相應(yīng)的發(fā)布帖子對應(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為''時的整個記錄
    showmessage('不能輸入特殊字符或表情!');//給用戶提示
}

流程就是跟上面提到的一樣,當然在發(fā)帖的中間,我們應(yīng)該在判斷中加入對標題的判斷,也就是除了message這個字段外,還應(yīng)該加入subject字段加進來一起做判斷。這種其實是退一步的方式,因為至少付出了多余的兩條sql操作,實際上如果我們確定了這些字符對應(yīng)的范圍,然后使用正則在執(zhí)行insert前就可以過濾掉。

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

我們在微信上24小時期待你的聲音

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

轉(zhuǎn)載請注明出處:長沙論壇開發(fā):Discuz發(fā)布特殊字符帖子內(nèi)容為空的臨時解決方案 - 微構(gòu)網(wǎng)絡(luò)
分享: