DZ的附件7天内重复下载不重复扣分

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分就可以了。然后勾选“可用”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值