“回复楼中楼”插件的一些劣势
Tillreetree 10天前

我开门见山吧:“回复楼中楼”插件写的实在太差了……具体体现在这些地方:

数据库列名问题

这个插件新增的列,光看名字你能猜出来什么用途吗?

  • repeat_follow
  • r_f_c
  • r_f_a

答案是:

  • 楼中楼的具体数据(以字符串形式存储的JSON)
  • 楼中楼的总数(数字)
  • 未知,但好像是楼中楼的最新楼层(数字)

效率

整个代码给我的感觉就是效率低,有不少手动操作的地方,也有一些有待改善的地方。

$pageno = min($pageno, $post['r_f_c']);
$pageno = max($pageno, 1);

 

例如这个,其实可以写到一行里嵌套使用min和max。

手动拼接JSON字符串

<?php
$m_s = ',';
$n = 0;

foreach ($arrs as $arr) {
	if ($arr['fl'] != $delfloor) {
		if ($n > 0) $m_s = ',';
		$message_json .= $m_s . '{"fl":"' . $arr['fl'] . '","uid":"' . $arr['uid'] . '","username":"' . $arr['username'] . '","avatar_url":"' . $arr['avatar_url'] . '","t_uid":"' . $arr['t_uid'] . '","t_username":"' . $arr['t_username'] . '","message":"' . str_replace(array('"', '\\',), array('\"', '\\' . '\\'), $arr['message']) . '","update":"' . $arr['update'] . '"}';
		$n++;
	}
}

if ($message_json != '') {
	$message_json = '[' . $message_json . ']';
	$r = db_update('post', array('pid' => $pid), array('repeat_follow' => $message_json, 'r_f_c' => $n));
}

原作者选择手动拼接JSON字符串,而不是使用PHP内置的数组和json_encode函数来生成JSON。这种做法不仅容易出错(尤其是在处理转义字符时),而且降低了代码的可读性和可维护性。

代码可读性

原代码的可读性较差。

例如几乎不怎么使用换行与注释提升可读性,变量命名(如$m_s、$r_f_g、$t_username、$t_uid、$message_t等)不够直观,循环中的条件判断也比较复杂。

在前端这个问题被完全放大了,请看以下变量名字:

  • p_u
  • np
  • p_r
  • p_i
  • mp

你永远猜不到这些变量的含义。

在前端,虽然多数操作是Ajax请求,但服务器返回的数据是两极分化的:

  • 成功的时候返回HTML,代表最新状态的回复列表
  • 失败的时候返回纯文本,指示具体错误信息

功能性

只有最低的功能性。它确实能把回复写入数据库里,也能读取并展示出来,但并不是最好的状态。

饱受诟病的一点是,当一个帖子有足够多的回复的时候,按照原本的设计和意图,它应该会显示第一页的几条内容,但不一定会显示出来,点击“查看”后也不一定会正确的显示第一页应该有的内容。

安全性

在拼接JSON字符串时,原作者使用了str_replace来转义引号和反斜杠。然而,这种做法可能不足以防止所有的安全漏洞,例如XSS攻击。

最新回复 (2)
全部楼主
  • Tillreetree 版主 楼主
    10天前 2
    0
    这个插件有bug,且没人做出修复版本不是没有理由的。一上手就感觉质量很差,想深挖一下?还是算了
  • baihe
    1天前 3
    0
    Tillreetree 这个插件有bug,且没人做出修复版本不是没有理由的。一上手就感觉质量很差,想深挖一下?还是算了
    这个
返回