我开门见山吧:“回复楼中楼”插件写的实在太差了……具体体现在这些地方:
数据库列名问题
这个插件新增的列,光看名字你能猜出来什么用途吗?
- 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等)不够直观,循环中的条件判断也比较复杂。
在前端这个问题被完全放大了,请看以下变量名字:
你永远猜不到这些变量的含义。
在前端,虽然多数操作是Ajax请求,但服务器返回的数据是两极分化的:
- 成功的时候返回HTML,代表最新状态的回复列表
- 失败的时候返回纯文本,指示具体错误信息
功能性
只有最低的功能性。它确实能把回复写入数据库里,也能读取并展示出来,但并不是最好的状态。
饱受诟病的一点是,当一个帖子有足够多的回复的时候,按照原本的设计和意图,它应该会显示第一页的几条内容,但不一定会显示出来,点击“查看”后也不一定会正确的显示第一页应该有的内容。
安全性
在拼接JSON字符串时,原作者使用了str_replace来转义引号和反斜杠。然而,这种做法可能不足以防止所有的安全漏洞,例如XSS攻击。