在插件或者二次开发中,经常会涉及到用户积分,改变用户积分的这种情况;
以前看到有些插件作者是直接UPDATE {$tablepre}members SET xxxxxx... 这样的方式来更新用户积分字段,最近我在学习开发过程中,也第一次接触到updatecredits这个函数,这个函数可以自动更新用户积分,另外自动积分变动提醒。
函数原型(include/global.func.php):- function updatecredits($uids, $creditsarray, $coef = 1, $extrasql = '') {
- if($uids && ((!empty($creditsarray) && is_array($creditsarray)) || $extrasql)) {
- global $db, $tablepre, $discuz_uid, $creditnotice, $cookiecredits;
- $self = $creditnotice && $uids == $discuz_uid;
- if($self && !isset($cookiecredits)) {
- $cookiecredits = !empty($_COOKIE['discuz_creditnotice']) ? explode('D', $_COOKIE['discuz_creditnotice']) : array_fill(0, 9, 0);
- }
- $creditsadd = $comma = '';
- foreach($creditsarray as $id => $addcredits) {
- $creditsadd .= $comma.'extcredits'.$id.'=extcredits'.$id.'+('.intval($addcredits).')*('.$coef.')';
- $comma = ', ';
- if($self) {
- $cookiecredits[$id] += intval($addcredits) * $coef;
- }
- }
- if($self) {
- dsetcookie('discuz_creditnotice', implode('D', $cookiecredits).'D'.$discuz_uid, 43200, 0);
- }
- if($creditsadd || $extrasql) {
- $db->query("UPDATE {$tablepre}members SET $creditsadd ".($creditsadd && $extrasql ? ', ' : '')." $extrasql WHERE uid IN ('$uids')", 'UNBUFFERED');
- }
- }
- }
复制代码 函数一共四个参数,后两个为可选参数,所以我们基础功能使用看前两个参数即可。
$uids:被更新的用户uid,可以是多个uid,如果是多个,则用逗号隔开,比如:1,3,4,6
$creditsarray:更新积分的具体内容的一个数组,里面指定要更新的积分id,更新数值,比如:- updatecredits($discuz_uid, array($credittype => $paynum));
复制代码 我这里的$credittype和$paynum都是从插件后台得到的变量,$credittype的值是extcredits1 - extcredits8里面的1-8数字,$paynum的值是要更新的积分数量,如果抛开变量,可以直观的写成:- updatecredits(1, array(2 => 20));
复制代码 这样的意思就是说,将uid=1的用户,更新他的积分extcredits2,更新20个值。
然后,扩展一下,更新多个用户的多个积分项目,可以这样:- updatecredits('1,3,6,34', array(1 => 50, 3=>20, 4=>80));
复制代码 这样的话就将这些用户的多项积分都进行了更新!
参考演示:
随着慢慢的熟悉,发现DZ很多现成的东西可以使用,就像以前我提到的sendpm()、sendmail()等等,了解熟悉以后,可以省去很多时间。 |