DZX3.1的附件下载依然有BUG,这个扣分不是出售附件,而是指后台积分策略中设置的每次下载附件所扣的小积分,目的是为了防止迅雷下载,或者被盗链。但这个下载扣分的问题从7.0时代一直存在,具体表现在:
1、下载自己上传的附件,要扣积分。
2、重复下载同一个附件,次次都扣积分。格东站长网
这两点显然是不合理的,下载自己的附件怎么能扣分呢?如果网络中断,或者误点击了,就再次扣分,很冤枉。之前的版本我都对这些问题作过修改,现在3.1版的代码结构不同,又要重新改代码。
DZ论坛有人出示过修改代码的方法,但有点问题,而且改得不太到位。只照顾了重复扣分的问题,而不排除下载自己的附件。另外,不管扣不扣分都给出积分提示,这让用户很担心的。正确的做法应该是:如果不扣积分,就直接开始下载。如果扣积分,才提示积分扣了多少。
具体修改方法:
1、创建一个记录附件扣分下载的数据表,运行SQL代码即可(其中CHARSET=gbk是编码,如果是utf8,要改为=utf8):
CREATE TABLE IF NOT EXISTS `pre_forum_attachment_once` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`aid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`dateline` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;
2、修改附件下载权限,打开/source/module/forum/forum_attachment.php,找到
if(!$isimage && !($_G['group']['exempt'] & $exemptvalue)) {
这句的含义是,如果是非图片类的附件并且在后台规定了下载附件可以不扣积分,就直接下载附件。这里要添加两个额外条件:下载自己的附件、数据表中已记录扣过积分的。改成这样:
if(!$isimage && !($_G['group']['exempt'] & $exemptvalue) && $_G['uid'] != $attach['uid'] && !(DB::fetch_first("SELECT id FROM ".DB::table('forum_attachment_once')." WHERE aid='$aid' AND uid='$_G[uid]'"))) {
这样凡是不用扣分的,就什么提示也没有,直接下载。
3、对扣了分的,写入数据表。打开/source/module/forum/forum_misc.php,找到
$getattachcredits = updatecreditbyaction('getattach', $_G['uid'], array(), '', 1, 1, $thread['fid']);
这句是扣下载者积分的,扣掉之后就要把这个动作写进数据表。在之下添加一句:
DB::query("insert into ".DB::table('forum_attachment_once')." (`aid`, `uid`, `dateline`) VALUES ('$aid', '$_G[uid]', '$_G[timestamp]')");
以上完成BUG的修补。不过时间一长,附件下载记录表会变得很大,也没必要长期记录着(当然也可以一直记着,永远不重复扣分)。可以用后台的计划任务定期清理过期的记录,比如7天过期,每天清理一次。
那就再做第4个动作:
4、计划任务。用以下代码创建一个PHP文件,命名为cron_clean_attachment.php或其它名字都可以,但要cron_开头。
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
$deltime = $_G['timestamp'] - 3600*24*7;
DB::query("delete from ".DB::table('forum_attachment_once')." where `dateline`<'$deltime'");
?>
把文件上传到source/include/cron文件夹内。然后在后台添加新的计划任务,填写任务名为“自动清理附件下载记录”或其它自己喜欢的,脚本名为cron_clean_attachment.php,时间设置为每天的某点0分就可以了。然后勾选“可用”。