掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
最近發(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)看一張圖:
這張圖很多人應(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ò)濾掉。
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流