Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[发布] 解决下载附件重复扣除积分

[复制链接]
gamedos 发表于 2009-9-17 11:20:38 | 显示全部楼层 |阅读模式
插件发布
插件名称: 解决下载附件重复扣除积分
插件来源:
适用版本: Discuz! 7.0
语言编码: GBK简体 UTF8简体 BIG5繁体 
最后更新时间:
插件作者: gamedos
插件简介: 设置下载附件扣除积分后
每次下载附件的时候都会扣除积分。
本插件解决这个问题,只要下载过一次就不重复扣除积分。
本帖最后由 gamedos 于 2009-9-17 23:19 编辑

感谢10楼的朋友找出bug,bug已经修改,附件也已更新

安装方法:
  • 下载对应编码的附件。
  • 把解压后的文件上传到论坛根目录,其中misc.php文件是需要覆盖的,以防万一请先备份好misc.php。
  • 执行install_downonce.php文件,这一步是创建数据表。方法: http://你的论坛地址/install_downonce.php

执行完就改完了。

原理分析:
建立一个新表,当第一次下载附件的时候记录用户id到这个表
第二次下载的时候检查这个表,查看是否已经下载过,
有就不扣积分,没有就扣除积分。
修改的文件:misc.php 中下载附件扣除积分的代码模块。

misc.php文件修改的地方:只有一处,就修改了elseif($action == 'attachcredit')的if语句块。

  1. } elseif($action == 'attachcredit') {

  2.         if($formhash != FORMHASH) {
  3.                 showmessage('undefined_action', NULL, 'HALTED');
  4.         }

  5.         $aid = intval($aid);
  6.         $attach = $db->fetch_first("SELECT tid, filename FROM {$tablepre}attachments WHERE aid='$aid'");
  7.         $thread = $db->fetch_first("SELECT fid FROM {$tablepre}threads WHERE tid='$attach[tid]' AND displayorder>='0'");
  8.         $forum = $db->fetch_first("SELECT getattachcredits FROM {$tablepre}forumfields WHERE fid='$thread[fid]'");
  9.         $getattachcredits = $forum['getattachcredits'] ? unserialize($forum['getattachcredits']) : $creditspolicy['getattach'];
  10.         $jm_uidlist = $db->result($db->query("SELECT uidlist FROM {$tablepre}attachments_once WHERE aid='$aid'"),0);
  11.         if(empty($jm_uidlist)) $jm_uidlist = '|';
  12.         if(strpos($jm_uidlist,$discuz_uid)>0){//check uid in uidlist
  13.                 $ck = substr(md5($aid.$timestamp.md5($authkey)), 0, 8);
  14.                 $key = md5($aid.md5($authkey).$timestamp);       
  15.                 $policymsg = $p = '';
  16.                 foreach($getattachcredits as $id => $policy) {
  17.                         $policy = 0;
  18.                         $policymsg .= $p.($extcredits[$id]['img'] ? $extcredits[$id]['img'].' ' : '').$extcredits[$id]['title'].' '.$policy.' '.$extcredits[$id]['unit'];
  19.                         $p = ', ';
  20.                 }
  21.         }else{
  22.                 checklowerlimit($getattachcredits, -1);
  23.                 $jm_uidlist .= "|$discuz_uid";
  24.                 $db->query("REPLACE INTO {$tablepre}attachments_once (aid, uidlist, dateline)
  25.                                         VALUES ('$aid', '$jm_uidlist','$timestamp')");
  26.                 updatecredits($discuz_uid, $getattachcredits, -1);
  27.        
  28.                 $ck = substr(md5($aid.$timestamp.md5($authkey)), 0, 8);
  29.                 $key = md5($aid.md5($authkey).$timestamp);
  30.        
  31.                 $policymsgs = $p = '';
  32.                 foreach($getattachcredits as $id => $policy) {
  33.                         $policymsg .= $p.($extcredits[$id]['img'] ? $extcredits[$id]['img'].' ' : '').$extcredits[$id]['title'].' '.$policy.' '.$extcredits[$id]['unit'];
  34.                         $p = ', ';
  35.                 }       
  36.         }
  37.         $sidauth = rawurlencode(authcode($sid, 'ENCODE', $authkey));
  38.         showmessage('attachment_credit', "attachment.php?aid=$aid&k=$key&t=$timestamp&ck=$ck&sid=$sidauth", '', 1);       
  39. }
复制代码

评分

1

查看全部评分

 楼主| gamedos 发表于 2009-9-17 12:00:59 | 显示全部楼层
本帖最后由 gamedos 于 2009-9-21 16:44 编辑

【2009-09-21】 修改
添加了定期清除数据的方法,

修改方法:
把这个
  1. } elseif($action == 'attachcredit') {
复制代码
if语句块换成下面的

  1. } elseif($action == 'attachcredit') {

  2.         if($formhash != FORMHASH) {
  3.                 showmessage('undefined_action', NULL, 'HALTED');
  4.         }

  5.         $aid = intval($aid);
  6.         $attach = $db->fetch_first("SELECT tid, filename FROM {$tablepre}attachments WHERE aid='$aid'");
  7.         $thread = $db->fetch_first("SELECT fid FROM {$tablepre}threads WHERE tid='$attach[tid]' AND displayorder>='0'");
  8.         $forum = $db->fetch_first("SELECT getattachcredits FROM {$tablepre}forumfields WHERE fid='$thread[fid]'");
  9.         $getattachcredits = $forum['getattachcredits'] ? unserialize($forum['getattachcredits']) : $creditspolicy['getattach'];
  10.         $jm_uidlist = $db->result($db->query("SELECT uidlist FROM {$tablepre}attachments_once WHERE aid='$aid'"),0);
  11.         $last_time = $db->result($db->query("SELECT dateline FROM {$tablepre}attachments_once WHERE aid='$aid'"),0);
  12.         $clear_db_day = 30;//删除数据库记录的周期,单位天               
  13.         $clear_db     = true;//是否定期清楚数据库的开关,值为true启用,值为false关闭
  14.         if(empty($last_time)) $last_time = 0;
  15.         if(empty($jm_uidlist)) $jm_uidlist = '|';
  16.         if(strpos($jm_uidlist,$discuz_uid)>0){//check uid in uidlist
  17.                 $ck = substr(md5($aid.$timestamp.md5($authkey)), 0, 8);
  18.                 $key = md5($aid.md5($authkey).$timestamp);       
  19.                 $policymsg = $p = '';
  20.                 foreach($getattachcredits as $id => $policy) {
  21.                         $policy = 0;
  22.                         $policymsg .= $p.($extcredits[$id]['img'] ? $extcredits[$id]['img'].' ' : '').$extcredits[$id]['title'].' '.$policy.' '.$extcredits[$id]['unit'];
  23.                         $p = ', ';
  24.                 }
  25.         }else{
  26.                 checklowerlimit($getattachcredits, -1);       
  27.                 $jm_uidlist .= "|$discuz_uid";
  28.                 $db->query("REPLACE INTO {$tablepre}attachments_once (aid, uidlist, dateline)
  29.                                         VALUES ('$aid', '$jm_uidlist','$timestamp')");               
  30.                 updatecredits($discuz_uid, $getattachcredits, -1);
  31.        
  32.                 $ck = substr(md5($aid.$timestamp.md5($authkey)), 0, 8);
  33.                 $key = md5($aid.md5($authkey).$timestamp);
  34.        
  35.                 $policymsgs = $p = '';
  36.                 foreach($getattachcredits as $id => $policy) {
  37.                         $policymsg .= $p.($extcredits[$id]['img'] ? $extcredits[$id]['img'].' ' : '').$extcredits[$id]['title'].' '.$policy.' '.$extcredits[$id]['unit'];
  38.                         $p = ', ';
  39.                 }       
  40.         }
  41.         if($clear_db){
  42.                 if(($timestamp-$last_time)>($clear_db_day*86400)){
  43.                         $jm_uidlist = "|$discuz_uid";
  44.                         $db->query("UPDATE {$tablepre}attachments_once SET uidlist='$jm_uidlist',dateline='$timestamp' WHERE aid='$aid'");
  45.                 }
  46.         }
  47.         $sidauth = rawurlencode(authcode($sid, 'ENCODE', $authkey));
  48.         showmessage('attachment_credit', "attachment.php?aid=$aid&k=$key&t=$timestamp&ck=$ck&sid=$sidauth", '', 1);       
  49. }
复制代码
说明

  1.         $clear_db_day = 30;//删除数据库记录的周期,单位天               
  2.         $clear_db     = true;//是否定期清楚数据库的开关,值为true启用,值为false关闭
复制代码
这2个参数可以设置清楚数据周期和启动开关。
不会修改的朋友, 重新下载一下这个下面的附件吧。

评分

2

查看全部评分

回复

使用道具 举报

ds3700 发表于 2009-9-17 12:09:22 | 显示全部楼层
留个记号  

http://www.kuokan.com
回复

使用道具 举报

aoling327 发表于 2009-9-17 13:27:56 | 显示全部楼层
好东西 不错·
回复

使用道具 举报

abcnic18 发表于 2009-9-17 13:55:23 | 显示全部楼层
嗯 先看看的
回复

使用道具 举报

不被谁所认识 发表于 2009-9-17 19:08:31 | 显示全部楼层
支持LZ下,估计又是个强人
回复

使用道具 举报

saleroad 发表于 2009-9-17 19:19:26 | 显示全部楼层
好东西,安装试试看。
回复

使用道具 举报

magentoon 发表于 2009-9-17 21:34:33 | 显示全部楼层
这是好多人千呼万唤的插件哦,官方就是解决不了!
回复

使用道具 举报

7598602 发表于 2009-9-17 22:47:15 | 显示全部楼层
难道现在 下载还是有错误吗
回复

使用道具 举报

7598602 发表于 2009-9-17 22:56:57 | 显示全部楼层
测试了下 感觉还是不行

如果没有积分点击下载后 会提示积分不够 可是在下载就能下载了 而且积分没扣
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-16 14:54 , Processed in 0.041352 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表