掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
最近發(fā)現(xiàn)了一個非常有意思的問題,那就是我們可以在幾乎所有的基于Discuz的論壇中發(fā)布標題和帖子都為空的內(nèi)容,這種情況在正常的運營過程中是不可能出現(xiàn)的,而且出現(xiàn)之后肯定是非常影響用戶體驗的。比如一整版都被刷成了空白,想想都要氣炸了。說到這個問題,我們先來看一張圖:
這張圖很多人應(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前就可以過濾掉。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流