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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

【投稿第三期】updatecredits使用

[复制链接]
体无完肤 发表于 2009-12-29 10:42:23 | 显示全部楼层 |阅读模式
在插件或者二次开发中,经常会涉及到用户积分,改变用户积分的这种情况;

以前看到有些插件作者是直接UPDATE {$tablepre}members SET xxxxxx... 这样的方式来更新用户积分字段,最近我在学习开发过程中,也第一次接触到updatecredits这个函数,这个函数可以自动更新用户积分,另外自动积分变动提醒。

函数原型(include/global.func.php):
  1. function updatecredits($uids, $creditsarray, $coef = 1, $extrasql = '') {
  2.         if($uids && ((!empty($creditsarray) && is_array($creditsarray)) || $extrasql)) {
  3.                 global $db, $tablepre, $discuz_uid, $creditnotice, $cookiecredits;
  4.                 $self = $creditnotice && $uids == $discuz_uid;
  5.                 if($self && !isset($cookiecredits)) {
  6.                         $cookiecredits = !empty($_COOKIE['discuz_creditnotice']) ? explode('D', $_COOKIE['discuz_creditnotice']) : array_fill(0, 9, 0);
  7.                 }
  8.                 $creditsadd = $comma = '';
  9.                 foreach($creditsarray as $id => $addcredits) {
  10.                         $creditsadd .= $comma.'extcredits'.$id.'=extcredits'.$id.'+('.intval($addcredits).')*('.$coef.')';
  11.                         $comma = ', ';
  12.                         if($self) {
  13.                                 $cookiecredits[$id] += intval($addcredits) * $coef;
  14.                         }
  15.                 }
  16.                 if($self) {
  17.                         dsetcookie('discuz_creditnotice', implode('D', $cookiecredits).'D'.$discuz_uid, 43200, 0);
  18.                 }

  19.                 if($creditsadd || $extrasql) {
  20.                         $db->query("UPDATE {$tablepre}members SET $creditsadd ".($creditsadd && $extrasql ? ', ' : '')." $extrasql WHERE uid IN ('$uids')", 'UNBUFFERED');
  21.                 }
  22.         }
  23. }
复制代码
函数一共四个参数,后两个为可选参数,所以我们基础功能使用看前两个参数即可。

$uids:被更新的用户uid,可以是多个uid,如果是多个,则用逗号隔开,比如:1,3,4,6

$creditsarray:更新积分的具体内容的一个数组,里面指定要更新的积分id,更新数值,比如:
  1. updatecredits($discuz_uid, array($credittype => $paynum));
复制代码
我这里的$credittype和$paynum都是从插件后台得到的变量,$credittype的值是extcredits1 - extcredits8里面的1-8数字,$paynum的值是要更新的积分数量,如果抛开变量,可以直观的写成:
  1. updatecredits(1, array(2 => 20));
复制代码
这样的意思就是说,将uid=1的用户,更新他的积分extcredits2,更新20个值。

然后,扩展一下,更新多个用户的多个积分项目,可以这样:
  1. updatecredits('1,3,6,34', array(1 => 50, 3=>20, 4=>80));
复制代码
这样的话就将这些用户的多项积分都进行了更新!

参考演示:


随着慢慢的熟悉,发现DZ很多现成的东西可以使用,就像以前我提到的sendpm()、sendmail()等等,了解熟悉以后,可以省去很多时间。

评分

4

查看全部评分

ly0519 发表于 2009-12-29 10:49:29 | 显示全部楼层
不错,支持一下!
回复

使用道具 举报

916188810 发表于 2009-12-29 10:50:01 | 显示全部楼层
支持...沙发
回复

使用道具 举报

uucehua 发表于 2009-12-29 10:50:21 | 显示全部楼层
学习了!~支持体哥
回复

使用道具 举报

916188810 发表于 2009-12-29 10:50:38 | 显示全部楼层
卡一下给人抢了沙发了。。。
回复

使用道具 举报

dljaini 发表于 2009-12-29 10:50:38 | 显示全部楼层
我是强哥的超级大粉丝
回复

使用道具 举报

daihujun 发表于 2009-12-29 10:50:48 | 显示全部楼层
沙发!!!!!!!!!!!!!
回复

使用道具 举报

gucl1026 发表于 2009-12-29 10:52:15 | 显示全部楼层
支持一下。
回复

使用道具 举报

jjtear 发表于 2009-12-29 10:58:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ARCHY` 发表于 2009-12-29 11:07:40 | 显示全部楼层
支持了!!我好像刚好需要
想把一个积分项去掉  把这个积分换成另外一种积分
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 07:01 , Processed in 0.034760 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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